在搭建trac/svn系统时,一般都会采用apache的.htacces 认证方法 但trac本身并不提供修改密码的功能,修改密码只能通过htpasswd/htpasswd2命令来进行,这的确是一件相当不make sense的事。
其实,利用一个免费的perl脚本可以方便的通过http方式修改apache的认证文件。
文件名:htpasswd.pl,获取地址http://home.xnet.com/~efflandt/pub/htpasswd.pl
该脚本可以通过web浏览器从你的htpasswd文件直接增加或者删除用户,管理者密码是经过加密的。该脚本本身并不保护一个目录,也不创建一个口令保护功能。它仅用来帮助你管理你的口令文件。这就是说在你的服务器上事先应有口令文件时,该脚本方可发挥作用。
安装&配置
step1.拷贝htpasswd.pl至cgi-bin目录 suse对应/srv/www/cgi-bin
fedora对应/var/www/cgi-bin
step2.改名 把htpasswd.pl改名为htpasswd.cgi
step3.用文本编辑器打开配置脚本(cfg.pl)
编辑如下变量:
#!/usr/local/bin/perl 修改为 #!/bin/perl
配置要修改的apache认证文件,找到以下几行
# Password file with full system path (where not accessible by URL).
$file = '/full_path_to/.htpasswd'; 修改为 $file='/etc/svn-auth-file'#假设你的验证文件是/etc/svn-auth-file
step4 chmod 755 htpasswd.cgi
不出意外的话,访问http://localhost/cgi-bin/htpasswd.cgi即可出现密码修改页面
有关密码文件创建,请参见 http://blog.csdn.net/forlinux/archive/2006/06/11/787703.aspx
-----htpasswd.pl-------
- #!/usr/local/bin/perl-T
- #htpasswd.cgibyDavidEfflandt(efflandt@xnet.com)8/97
- #Lastupdate10/4/99
- #
-
#Updatepasswordfilefromthewebforusewithuserauthentication.
- #Storeseachlineintheformat:username:crypted_password
- #
-
#Built-informisprovidedifyouGETthescript.
-
#FormisprocessedifyouPOSTtothisscript.
- #
- #Ifyouwantyourpasswordstobesecure,itisbesttorunthis
-
#suidasyou(chmod4705htpasswd.cgi)whichmayrequireCwrapper.
- #Alsokeepthisscriptinadirectorythatrequiresuserauthentication
-
#unlessyouallownewuserstosettheirownpassword(see$allow_new).
- #
-
#Ifnotrunningsuidyoushouldtouchthepasswordfilefirstand
-
#chmod606(orwhateverisreq'dtoaccessitasyouandwebserver).
- #
-
#Toaddorremoveusersbyanadministrator,createausercalled'admin'
-
#withapassword.Enterusernameyouwanttoaddorremovewithadmin
-
#passwordas"CurrentPassword"(plusnewpasswordsfornewusers).
- #
-
#Anyonemayremovetheirownnamefromthepasswordfileiftheysupply
- #theircorrectpassword.
- ###Variables
- #Passwordfilewithfullsystempath(wherenotaccessiblebyURL).
-
$file='/full_path_to/.htpasswd';
-
#Allowanyonetoaddnewusers(1=yes,0=no)
-
$allow_new=0;
-
#Setuntaintedpathforsuidscripts
-
$ENV{PATH}='/bin:/usr/bin:/usr/local/bin';
-
$ENV{IFS}=""if$ENV{IFS}ne"";
-
###EndofVariables
-
#CreateformandexitonGET
-
&make_formunless($ENV{'REQUEST_METHOD'}eq"POST");
- #GetPOSTinput
-
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
- #Splitthename-valuepairs
-
@pairs=split(/&/,$buffer);
-
foreach$pair(@pairs)
- {
-
($name,$value)=split(/=/,$pair);
-
$value=~tr/+//;
-
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
-
$name=~tr/+//;
-
$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
-
$FORM{$name}=$value;
- }
-
if($FORM{user}){
-
$user=$FORM{user};
-
}else{
-
&error("Error","Usernamemissingfromform.");
- }
-
$pwd=$FORM{old};
-
$command=$FORM{command};
-
unless(($commandeq'remove')
-
||($FORM{new}&&$FORM{new}eq$FORM{new2})){
-
&error("PasswordMismatch","Newpasswordmismatchormissing.");
- }
- #Getexistingpasswords
-
if(-e$file){
-
open(IN,$file)or&error("Error","Can'topenpasswordfile:$!");
-
flock(IN,2);
- seek(IN,0,0);
-
while(<IN>){
- chomp;
-
($name,$value,$tail)=split(/:/,$_,3);
-
$hash{$name}=$value;
-
$tail{$name}=$tail;#maintainanyadditionalfields
- }
- closeIN;
- }
-
#Saltforcrypt
-
@range=('0'..'9','a'..'z','A'..'Z','.','/');
- srand(time()^($$+($$<<15)));
-
$salt=$range[rand(int($#range)+1)].$range[rand(int($#range)+1)];
-
#Checkforvalidpasswordorexistinguser
-
$pass=$hash{$user}if$hash{$user};
-
$cpwd=crypt($pwd,$pass);
-
$admin=$hash{admin}&&crypt($pwd,$hash{admin})eq$hash{admin};
-
if(($commandne'new')&&($admin||$pass&&$cpwdeq$pass)){
-
if($commandeq'remove'){
-
delete($hash{$user});delete($tail{$user});
-
$msg="User<B>$user</B>wasremovedfrompasswordfile.";
-
}elsif(!$pass){
-
$msg="WARNING!'ChangePassword'checkedfornon-existinguser?\n"
-
."<P>Assigningpasswordfornewuser<B>$user</B>anyway.\n"
-
."<P>Ifthiswasanerror,gobackand'RemoveUser'";
-
}else{
-
$msg="Passwordhasbeenupdatedfor$user.";
- }
-
}elsif($FORM{command}eq'new'){
-
if($pass){
-
&error("Sorry","User<B>$user</B>isalreadyassigned.");
-
}elsif($allow_new||$admin){
-
$msg="Passwordhasbeenassignedfornewuser$user.";
-
}else{
-
&begin_html("Sorry,NewUser");
-
print"Contactfileownerforpasswordyoucanchangelater.";
- &end_html;
-
exit;
- }
-
}else{
-
&error("PasswordError",
-
"Invaliduserorpasswordorforgottocheck'NewUser'.");
- }
-
#Assignnewpasswordtouserandwritetofile
-
$hash{$user}=crypt($FORM{new},$salt)if$commandne'remove';
-
if(open(OUT,">$file")){
-
flock(OUT,2);
- seek(OUT,0,0);
-
foreach$name(sortkeys%hash){
-
printOUT"$name:$hash{$name}";
-
printOUT":$tail{$name}"if$tail{$name};
-
printOUT"\n";
- }
-
}else{
-
&error("Error","Can'tupdatepasswordfile:$!");
- }
- #PrintReturnHTML
-
&begin_html("ThankYou");
-
print"$msg\n";
- &end_html;
- ###Subroutines
- #subroutinebegin_html(title)
- subbegin_html{
-
local($title)=@_;
-
print"Content-type:text/html\n\n";
-
print"<html><head><title>$title</title></head><body>\n";
-
print"<center><h1>$title</h1></center>\n<hr><p>\n";
- }
- #subroutineend_html
- subend_html{
- #Addfooterlinkshere
-
print"<P></body></html>\n";
- }
- #subroutinemake_form
- submake_form{
-
&begin_html("ChangeorAddPassword");
- print<<NEW_FORM;
-
Usethisformtochangeyourpasswordforaccesstorestricted
-
directorieshere.Newuserswillbeinformedifpasswordwasassignedor
-
iftheyneedtocontacttheownerofthesepages.
-
<FORMMETHOD="POST"ACTION="$ENV{SCRIPT_NAME}">
- <DL>
-
<DT>E-mailAddress(orusernameonthissystem):
-
<DD><INPUTNAME="user">
-
<DT>CurrentPassword(requiredunlessnewuser):
-
<DD><INPUTTYPE=PASSWORDNAME="old">
- <DT>NewPassword:
-
<DD><INPUTTYPE=PASSWORDNAME="new">
- <DT>ConfirmNewPassword:
-
<DD><INPUTTYPE=PASSWORDNAME="new2">
- <DT>Request:
- <DD>
-
<INPUTTYPE="radio"NAME="command"VALUE="change"CHECKED>ChangePassword
- <DD>
-
<INPUTTYPE="radio"NAME="command"VALUE="new">NewUser
- <DD>
-
<INPUTTYPE="radio"NAME="command"VALUE="remove">RemoveUser
- </DL>
-
<P><INPUTTYPE="submit"VALUE="SubmitRequest">
- </FORM>
- NEW_FORM
- &end_html;
-
exit;
- }
- suberror{
-
local($title,$msg)=@_;
-
&begin_html($title);
-
print"<P>$msg\n";
-
print"<P>Pleasecheckyournameandre-enterpasswords.\n";
- &end_html;
-
exit;
- }
分享到:
相关推荐
Unix Like的操作系统下的大部分软件都是基于命令行的,使用文本文件进行配置,这样虽说对一些用惯了Windows下软件的朋友们会有些复杂的感觉,但是这样的软件还是有好处的,毕竟其没有Gui会有更高的性能,配置文件...
Algorithm-htpasswd.zip,http基本身份验证密码文件实用程序的node.js包。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
rpm包安装htpasswd所需包rpm包安装htpasswd所需包rpm包安装htpasswd所需包rpm包安装htpasswd所需包rpm包安装htpasswd所需包rpm包安装htpasswd所需包rpm包安装htpasswd所需包rpm包安装htpasswd所需包rpm包安装...
Ansible-ansible-role-htpasswd.zip,ansible角色-htpasswdansible角色:htpasswd,ansible是一个简单而强大的自动化引擎。它用于帮助配置管理、应用程序部署和任务自动化。
htpasswd.exe
2. **创建或更新密码文件**:使用Apache提供的htpasswd命令行工具,或者通过其他第三方工具,如`Apache22Passwd.cgi`,创建或更新用户密码。例如,创建一个新用户"testuser"的命令是: ``` htpasswd -cm C:/path/...
4. **启用认证**:使用`auth_file`指定包含用户名和密码的文件,如`auth_file .htpasswd`。 5. **重启服务器**:更新配置后,重启SHTTPD使更改生效。 **SHTTPD与开发** 对于开发者而言,SHTTPD的轻量级特性和快速...
总结起来,为Nginx目录设置访问密码是一个涉及创建用户凭证文件(如`htpasswd.py`生成的`.htpasswd`文件)以及在Nginx配置文件中设置相应的身份验证规则的过程。这一过程不仅增强了服务器的安全性,还为管理员提供了...
Apache的htpasswd(HTTP基本认证密码文件)是用于在Web服务器上设置用户验证的一种方法,主要应用于保护网站或特定资源不被未经授权的访问者访问。它通过创建一个包含用户名和经过加密密码的文本文件来实现这一功能...
用于管理HTTP基本身份验证密码文件的CLI工具。 基本上,这是Apache 实用程序的Node.js实现。 安装 通过git(或下载的tarball): $ git clone git://github.com/http-auth/htpasswd.git 通过 : $ npm install ...
在这个设置下,Apache负责用户认证,可以使用其内置的各种认证机制,包括使用htpasswd管理的密码文件。 知识点4:远程修改用户密码 在Apache和Subversion的集成环境中,如果需要远程修改用户密码,通常需要通过...
$htpasswdPath = "c:\Program Files\VisualSVN Server\bin\htpasswd.exe"; 3. 修改htdocs文件夹中的pwd.php文件,将第4行的$passwdfile改为实际的路径 $passwdfile="C:\\Repositories\\htpasswd"; 4. 重新启动...
2. **编辑`.htpasswd`文件**:使用文本编辑器打开`.htpasswd`文件,找到你想修改密码的用户行。每行由用户名和加密密码组成,用冒号分隔。例如,`username:$apr1$encryptedpassword`。 3. **密码加密**:如果你需要...
VisualSVN Server 添加自助修改密码页面所需的文件,解压后,从里面提取一个文件 htpasswd.exe 放到:C:\Program Files\VisualSVN Server\bin\htpasswd.exe
在Apache中,用户认证通常通过配置`.htaccess`和`.htpasswd`文件实现。`.htaccess`文件是服务器上的一个配置文件,允许我们在特定目录级别设置访问控制。`.htpasswd`文件则存储了用户的用户名和加密后的密码,每行...
2. **htpasswd.exe**:这是一个命令行工具,通常用于创建和管理Apache HTTP服务器的.htpasswd文件,其中存储了SVN用户的用户名和加密密码。在这个上下文中,它可能被集成到`main.exe`中,用于处理密码的加密和验证。...