Linux远程修改用户密码工具
使用方法:
1、将文件ChangePasswd.cgi和ChangePasswd.ini
放到apche安装目录下的cgi-bin下
2、确认ChangePasswd.cgi 程序第1行 ,prel工具的位置
(我的:#!/usr/bin/perl -w)
/usr/bin/perl
3、修改ChangePasswd.cgi 第84行
改成htpasswd所在的路径 (我的:/project/apache/bin/htpasswd)
4、修改ChangePasswd.cgi 128行
ini文件改成完整路径 (我的:/project/apache/cgi-bin/ChangePasswd.ini)
5、配置文件
ChangePasswd.ini 第2行authuserfile= 密码存放路径
(我的:/svndata/svn-auth-file/passwd)
6、配置文件 ChangePasswd.ini 第3行logfile=
操作日志存放路径 (我的:/project/apache/cgi-bin/ChangPasswd.log)
(前6为网上所得,但使用后仍然不成功,经自己查证,此处要注意)
7.chmod -R 755 cgi-bin目录(我的:
/var/www/cgi-bin)
注意细节:
1、用htpasswd时 切勿用-m参数
如果以前用的话,可重新输入一次进行更新
2、ChangPasswd.log 必须有“w”写入权限
把以下内容复制下来保存为ini后缀的文件ChangePasswd.ini
[path]
authuserfile=/repository/auth/authfile
logfile=/repository/auth/ChangPasswd.log
[setup]
pwdminlen=6
[html]
title=SVN用户密码自助修改
description=SVN用户密码自助修改
yourname=用户名
oldpwd=旧密码
newpwd1=新密码
newpwd2=确认新密码
btn_change=修
改
btn_reset=重 置
changepwdok=成功修改密码
changepwdfailed=修改密码失败
servererror=服务器错误
passmustgreater=新密码位数必须大于
twopassnotmatched=两密码不一致
entername=请输入用户名
enterpwd=密码未输入
errorpwd=你的密码不正确
back=返回
把以下内容复制下来保存为cgi后缀的文件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 (<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("/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 (<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=gb2312"
/>
</head>
<body>
<HR>
<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><input type="submit"
name="chgpasswd" value="$btn_change"> <input type="reset"
value="$btn_reset"></TD></TR>
</TABLE>
</form>
<HR>
<font
color="#FF0000">注意:新密码位数必需大于$pwdminlen,且为字母与数字组合</font>
<P>如有问题请与DreamLee联系</P>
<P>北京安高科技网站:</P>
<P>公司主页:<a
href=http://www.magnus.cn>http://www.magnus.cn</a></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=gb2312">
<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>如有问题请与DreamLee联系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;
}
}
原文:http://hi.baidu.com/%B2%BB%B0%AE%B5%BD%B0%AE/blog/item/8ef905455d70903285947364.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类