歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux下Subversion自助修改密碼

前陣兒公司內部配置好了subverion來做版代碼管理,為了便於個人修改密碼,所以網上找了很多關於自助修改密碼的資料,結果發現很多都是針對windows版的,即使有針對linux版的,但還是有一些問題,不能直接拿來用,說明文字也比少。

下面是我自己用的配置文件,99%來源於網絡,只有很少一點點是我根據自己的實際情況修改的。希望對大家有用。

需要倆個文件:
svnpass.ini
svnpass.cgi

svnpass.ini中的內容如下:

[path]
authuserfile=/opt/svn/svnuser    
logfile=/opt/svn/changepwd.log
[setup]
pwdminlen=2
[html]
title=SVN用戶密碼自助修改
description=SVN用戶密碼自助修改
yourname=用戶名
oldpwd=舊密碼
newpwd1=新密碼
newpwd2=確認新密碼
btn_change=修 改
btn_reset=重 置

changepwdok=成功修改密碼
changepwdfailed=修改密碼失敗
servererror=服務器錯誤
passmustgreater=新密碼位數必須大於
twopassnotmatched=兩密碼不一致
entername=請輸入用戶名
enterpwd=密碼未輸入
errorpwd=你的密碼不正確
back=返回

說明:
關鍵是紅顏色是三行內容:
authuserfile=/opt/svn/svnuser :subversion用戶與密碼文件存放位置
logfile=/opt/svn/changepwd.log :修改密碼的日志文件存放位置
pwdminlen=2 :密碼的最小長度
以上三項,根據實際情況修改即可。
其他內容保持不變即可。

svnpass.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 (length($UserNewPwd)<$pwdminlen)
    {&Writer_Log("Password's length must greater than".$pwdminlen);
     &otherhtml($title,$passmustgreater.$pwdminlen,$back);}
 elsif ($UserNewPwd =~/^\d+$/)
    {&Writer_Log("New Passwd isn't all diginal");
     &otherhtml($title,$pwd_not_alldiginal,$back);}
 elsif ($UserNewPwd =~/^[A-Za-z]+$/)
    {&Writer_Log("New Passwd isn't all char");
     &otherhtml($title,$pwd_not_allchar,$back);}
 elsif ($UserNewPwd ne $MatchNewPwd)
    {&Writer_Log("Two new passwords are not matched");
     &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);
                                   
                    if(crypt($UserPwd,$cryptpwd) eq $cryptpwd)
                    {#a
                     my $rc = system("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;
                    }#a
                    else
                    {#b
                     &Writer_Log("Old Passwd is Incorrect ");
                     &otherhtml($title,$errorpwd,$back);
                    }#b
                    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/svnpass.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" />
</head>
<body>
<center>
<HR>
<p>我的 SVN</P>
<P>主頁:https://192.168.1.5/svn</p>
<font color="#FF0000">注意:新密碼位數必需大於$pwdminlen,且為字母與數字組合</font>
<P></p>
</center>
<center><h1>$description</h1>
</center>
<form method="POST" enctype="multipart/form-data"  action="/cgi-bin/svnpass.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><input type="submit" name="chgpasswd" value="$btn_change"> <input type="reset" value="$btn_reset"></TD></TR>
</TABLE>
</form>
<center>
<HR>
<p>如有問題請與管理員聯系E-MAil:<A HREF="mailto:$admin_email">$admin_email</A>.</P>
</center>
</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/svnpass.cgi"><font size="4">$_[2]</font></a></p>

<HR>
<P>如有問題請與管理員聯系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;
}
}

說明:
同樣需要注意三個紅顏色的地方:
system("htpasswd -b $authuserfile $User $UserNewPwd");  :注意其中的命令htpasswd,與windows下的不同
/var/www/cgi-bin/svnpass.ini";    :配置文件的位置,就是上面的svnpass.ini位置

<a href="/cgi-bin/svnpass.cgi">   :cgi腳本的相對位置,很重要,一般就放在apache的cgi-bin目錄即可


這樣就可以通過url:https://192.168.1.5/cgi-bin/svnpass.cgi
這樣的方式來修改密碼了。當然,如果你的apache沒有配置加密http的話,可以不需要https,而直接用http即可
Copyright © Linux教程網 All Rights Reserved