Linux 下 SVN 远程 web 密码修改(踩坑修复版)

Linux 下 SVN 远程 web 密码修改(踩坑修复版)

准备步骤

注意:网上的那些照抄是实现不了的,其中有语法错误,我踩了很多坑。我这是直接修改好的,复制过去就可以直接用

  1. SVN 和 Apache 集成配置
  2. 将文件changePasswd.cgi和changePasswd.ini 放到apche安装目录下的cgi-bin下(一般情况下在此路径 /var/www/cgi-bin)
  3. 确认changePasswd.cgi 程序第1行 ,prel工具的位置 (我的:#!/usr/bin/perl -w)
    /usr/bin/perl(没有就需要先安装 perl、CGI,没有这个就无法运行)
  4. 修改changePasswd.cgi 改成htpasswd所在的路径 (我的:/usr/bin/htpasswd)
  5. 修改changePasswd.cgi ini文件改成完整路径 (我的:/var/www/cgi-bin/changePasswd.ini)
  6. 配置文件 changePasswd.ini 第2行authuserfile= 密码存放路径 (我的:/data/svn/svnrepos/conf/http_passwd)
  7. 配置文件 changePasswd.ini 第3行logfile= 操作日志存放路径 (我的:/data/svn/svnrepos/conf/changePasswd.log)

注意:网上的那些照抄是实现不了的,其中有语法错误,我踩了很多坑。我这是直接修改好的,复制过去就可以直接用

复制文件

changePasswd.cgi 文件

#!/usr/bin/perl -w #这个必须要有,声明用的,不要动
use strict;
use CGI;

my $time        = localtime;
my $remote_id   = $ENV{REMOTE_HOST} || $ENV{REMOTE_ADDR};
my $admin_email = $ENV{SERVER_ADMIN};

my $cgi = new CGI;
my $pwd_not_alldiginal = "密码规则:数字字母加特殊符号,八位以上,大小写";
my $pwd_not_allchar = "密码不能全为字符";
my $user_not_exists = "该用户不存在";
my $file_not_found = "文件不存在,请联系管理员";

my $authuserfile;
my $logfile;
my $pwdminlen;
my $title;
my $description;
my $yourname;
my $oldpwd;
my $newpwd1;
my $newpwd2;
my $btn_change;
my $btn_reset;

my $changepwdok;
my $changepwdfailed;
my $oldpwderror;
my $passmustgreater;
my $twopassnotmatched;
my $entername;
my $enterpwd;
my $errorpwd;
my $back;


&IniInfo;

if ($cgi -> param())
{#8
 my $User = $cgi->param('UserName');
 my $UserPwd = $cgi->param('OldPwd');
 my $UserNewPwd =  $cgi->param('NewPwd1');
 my $MatchNewPwd =  $cgi->param('NewPwd2');

 # 密码规则:数字字母加特殊符号,八位以上,大小写

 if (!$User)
     {&Writer_Log("Enter no user name");
       &otherhtml($title,$entername,$back);}
 elsif (!$UserPwd )
    {&Writer_Log("Enter no OldPasswd");
     &otherhtml($title,$enterpwd,$back); }
 elsif ($UserNewPwd !~ /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@%^&*]).{8,}$/)
    {&Writer_Log("New Passwd isn't all diginal:$User $UserPwd  $UserNewPwd $MatchNewPwd");
     &otherhtml($title,$pwd_not_alldiginal,$back);}
 elsif ($UserNewPwd ne $MatchNewPwd)
    {&Writer_Log("Two new passwords are not matched $UserNewPwd $MatchNewPwd");
     &otherhtml($title,$twopassnotmatched,$back);}
 else
{if($authuserfile)
 {#6
  open UserFile, "<$authuserfile" or die "打开文件失败:$!";
  while (<UserFile>)
    {#5
       my $varstr=$_;
       if($varstr =~/($User)/)
    {#3
     my $eqpos =index($varstr, ":");
     my $UserName = substr($varstr,0,$eqpos);
     my $cryptpwd = substr($varstr,$eqpos + 1,13);
     
     next if($UserName ne $User);
     &Writer_Log("UserName:$UserName UserPwd:$UserPwd cryptpwd:$cryptpwd ");
    
      my $rc = system("/usr/bin/htpasswd -b $authuserfile $User $UserNewPwd");
      if ($rc == 0)
         {#1
            &Writer_Log( $User.":Change Passwd");
            &otherhtml($title,$changepwdok,$back);
          }#1
       else
          {#2
           &Writer_Log( $User.":Change Passwd Failed");
           &otherhtml($title,$changepwdfailed,$back);
          }#2 
       exit;  
    }#3
       else
    {#4
     if(eof)
     { &Writer_Log($User.":no this user");
       &otherhtml($title,$user_not_exists,$back);
       exit;
     }
     else
     {next;}
    }#4   
     }#5
   close UserFile;
 }#6
else
 {#7
   &Writer_Log($authuserfile.":no found");
   &otherhtml($title,$file_not_found,$back);
 }#7
}
}#8
else{
      &Index_Html;
   }

sub IniInfo{
   my $inifile = "/var/www/cgi-bin/changePasswd.ini";
   open CGI_INI_FILE, "<$inifile" or die "打开文件失败:$!";

   while (<CGI_INI_FILE>){
   my $eqpos =index($_,'=');
   my $len = length($_);

   if ($_ =~/authuserfile/)
   {$authuserfile= substr($_, $eqpos + 1, $len - $eqpos -2);}
   elsif ($_ =~/logfile/)
   {$logfile= substr($_, $eqpos + 1);}
   elsif ($_ =~/pwdminlen/)
   {$pwdminlen= substr($_, $eqpos + 1);}
   elsif ($_ =~/title/)
   {$title = substr($_, $eqpos + 1);}
   elsif ($_ =~/description/)
   {$description = substr($_, $eqpos + 1);}
   elsif ($_ =~/yourname/)
   {$yourname = substr($_, $eqpos + 1);}
   elsif ($_ =~/oldpwd/)
   {$oldpwd= substr($_, $eqpos + 1);}
   elsif ($_ =~/newpwd1/)
   {$newpwd1= substr($_, $eqpos + 1);}
   elsif ($_ =~/newpwd2/)
   {$newpwd2= substr($_, $eqpos + 1);}
   elsif ($_ =~/btn_change/)
   {$btn_change = substr($_, $eqpos + 1);}
   elsif ($_ =~/btn_reset/)
   {$btn_reset = substr($_, $eqpos + 1);}
   elsif ($_ =~/changepwdok/)
   {$changepwdok = substr($_, $eqpos + 1);}
   elsif ($_ =~/changepwdfailed/)
   {$changepwdfailed = substr($_, $eqpos + 1);}
   elsif ($_ =~/oldpwderror/)
   {$oldpwderror = substr($_, $eqpos + 1);}
   elsif ($_ =~/passmustgreater/)
   {$passmustgreater = substr($_, $eqpos + 1);}
   elsif ($_ =~/twopassnotmatched/)
   {$twopassnotmatched = substr($_, $eqpos + 1);}
   elsif ($_ =~/entername/)
   {$entername = substr($_, $eqpos + 1);}
   elsif ($_ =~/enterpwd/)
   {$enterpwd= substr($_, $eqpos + 1);}
   elsif ($_ =~/errorpwd/)
   {$errorpwd= substr($_, $eqpos + 1);}
   elsif ($_ =~/back/)
   {$back = substr($_, $eqpos + 1);}
   }
   close CGI_INI_FILE;
}

sub Index_Html{
   print "Content-type: text/html\n\n"; #这个必须要有换行
   print <<END_OF_PAGE

   <html>
   <head>
      <title>$title</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <link href="https://cdnjs.cloudflare.com/ajax/libs/layui/2.9.14/css/layui.min.css" rel="stylesheet">
   </head>

   <body>
      <center><h1>$description</h1></center>
      <form method="POST" enctype="multipart/form-data" action="/cgi-bin/changePasswd.cgi">
         <br>
         <TABLE align="center">
            <TR><TD class="t_text">$yourname</TD><TD><input type="text" name="UserName"  /></TD></TR>
            <TR><TD class="t_text">$oldpwd</TD><TD><input type="password" name="OldPwd"  /></TD></TR>
            <TR><TD class="t_text">$newpwd1</TD><TD><input type="password" name="NewPwd1"  /></TD></TR>
            <TR><TD class="t_text">$newpwd2</TD><TD><input type="password" name="NewPwd2"  /></TD></TR>
         </TABLE>

         <br>
         <TABLE align="center">
             <TR><TD> &ensp;&ensp;&ensp;&ensp; <input type="submit" name="chgpasswd" class="layui-btn layui-btn-primary layui-border" value="$btn_change"> &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp; <input type="reset" class="layui-btn layui-btn-primary layui-border" value="$btn_reset"></TD></TR>
         </TABLE>
      </form>

      <HR>
      <font color="#FF0000">注意:新密码规则【数字、字母加特殊符号(!@%^&*),八位以上,大小写】</font>
      <P>如有问题请与管理员联系</P>
   </body>
   </html>
END_OF_PAGE #这个必须顶格,不然会报错
}

sub otherhtml{
   print "Content-type: text/html\n\n"; #这个必须要有换行
   print <<END_OF_PAGE
   <html>
   <head>
      <meta http-equiv="Content-Language" content="zh-cn">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>$_[0]</title>
   </head>

   <body>
      <p align="center"><font size="5">$_[1]</font></p>
      <p align="center"><a href="/cgi-bin/changePasswd.cgi"><font size="4">$_[2]</font></a></p>

      <HR>
      <P>如有问题请与 windone 联系 E-Mail: <A HREF="mailto:$admin_email">$admin_email</A>.</P>
   </body>
   </html>
END_OF_PAGE #这个必须顶格,不然会报错
}

sub Writer_Log{
   if($logfile){
      my $loginfo ="[".$time."] "." [".$remote_id."] "." || ".$_[0];
      open LOGFILE,">>$logfile" or die "Couldn't open LOG FILE for writing: $!";
      print LOGFILE ("$loginfo/n");
      close LOGFILE;
   }
}

changePasswd.ini 文件

[path]
authuserfile=/data/svn/svnrepos/conf/http_passwd
logfile=/data/svn/svnrepos/conf/changPasswd.log
[setup]
pwdminlen=8
[html]
title=SVN用户密码自助修改
description=SVN用户密码自助修改
yourname=用户名
oldpwd=旧密码
newpwd1=新密码
newpwd2=确认新密码
btn_change=修 改
btn_reset=重 置

changepwdok=成功修改密码
changepwdfailed=修改密码失败
servererror=服务器错误
passmustgreater=新密码位数必须大于
twopassnotmatched=两次密码不一致
entername=请输入用户名
enterpwd=密码未输入
errorpwd=您的密码不正确
back=返回
  • 复制过去后将两个文件升权和修改用户组
chmod -R 777 ../cgi-bin/
chown -R apache:apache ../cgi-bin/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值