将ChangePasswd.cgi和ChangePasswd.ini放在Apache的cgi-bin目录下,我是yum安装的apache所以路径为/var/www/cgi-bin
[root@svn ~]# cd /var/www/cgi-bin/ [root@svn cgi-bin]# chown -R apache:apache ./* [root@svn cgi-bin]# ll -h 总用量 16K -rwxr-xr-x 1 apache apache 5.8K 6月 19 2015 ChangePasswd.cgi -rwxr-xr-x 1 apache apache 602 6月 19 2015 ChangePasswd.ini -rw-r--r-- 1 apache apache 298 6月 19 11:40 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 (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 () {#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("/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; }#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/ChangePasswd.ini"; open CGI_INI_FILE, "<$inifile" or die "打开文件失败:$!";; while ( ) { 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 < $title
$description
注意:新密码位数必需大于$pwdminlen,且为字母与数字组合