htpasswd.cgi 网页远程修改gerrit ht 认证的密码文件
在搭建gerrit系统时,一般都会采用apache的.htacces 认证方法 但trac本身并不提供修改密码的功能,修改密码只能通过htpasswd/htpasswd2命令来进行,这的确是一件相当不make sense的事。
其实,利用一个免费的perl脚本可以方便的通过http方式修改apache的认证文件。
文件名:htpasswd.pl,获取地址http://home.xnet.com/~efflandt/pub/htpasswd.pl
该脚本可以通过web浏览器从你的htpasswd文件直接增加或者删除用户,管理者密码是经过加密的。该脚本本身并不保护一个目录,也不创建一个口令保护功能。它仅用来帮助你管理你的口令文件。这就是说在你的服务器上事先应有口令文件时,该脚本方可发挥作用。
安装&配置
1.拷贝htpasswd.pl至cgi-bin目录
linux对应 /var/www/cgi-bin
suse对应/srv/www/cgi-bin
fedora对应/var/www/cgi-bin
或者放置在例如如/usr/lib 的任意位置,不过需要在apache的配置文件vi /etc/apache2/sites-available/default添加:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
2.改名
把htpasswd.pl改名为htpasswd.cgi
3.用文本编辑器打开配置脚本(cfg.pl)
编辑如下变量:
#!/usr/local/bin/perl 修改为 #!/bin/perl
配置要修改的apache认证文件,找到以下几行
# Password file with full system path (where not accessible by URL).
$file = '/home/gerrit/gerrit.passwd'; 修改为你的验证文件是/etc/apache2/auth-file
step4 chmod 755 htpasswd.cgi
已经配置搭建好apache的话,访问http://localhost/cgi-bin/htpasswd.cgi即可出现密码修改页面
#!/usr/bin/perl
# htpasswd.cgi by David Efflandt (efflandt@xnet.com) 8/97
# Last update 10/4/99
#
# Update password file from the web for use with user authentication.
# Stores each line in the format: username:crypted_password
#
# Built-in form is provided if you GET the script.
# Form is processed if you POST to this script.
#
# If you want your passwords to be secure, it is best to run this
# suid as you (chmod 4705 htpasswd.cgi) which may require C wrapper.
# Also keep this script in a directory that requires user authentication
# unless you allow new users to set their own password (see $allow_new).
#
# If not running suid you should touch the password file first and
# chmod 606 (or whatever is req'd to access it as you and webserver).
#
# To add or remove users by an administrator, create a user called 'admin'
# with a password. Enter username you want to add or remove with admin
# password as "Current Password" (plus new passwords for new users).
#
# Anyone may remove their own name from the password file if they supply
# their correct password.
### Variables
# Password file with full system path (where not accessible by URL).
$file = '/home/gerrit/gerrit.passwd';
# Allow anyone to add new users (1 = yes, 0 = no)
$allow_new = 0;
# Set untainted path for suid scripts
$ENV{PATH} = '/bin:/usr/bin:/usr/local/bin';
$ENV{IFS} = "" if $ENV{IFS} ne "";
### End of Variables
# Create form and exit on GET
&make_form unless ($ENV{'REQUEST_METHOD'} eq "POST");
# Get POST input
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
# Split the name-value pairs
@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", "Username missing from form.");
}
$pwd = $FORM{old};
$command = $FORM{command};
unless (($command eq 'remove')
||($FORM{new} && $FORM{new} eq $FORM{new2})) {
&error("Password Mismatch", "New password mismatch or missing.");
}
# Get existing passwords
if (-e $file) {
open (IN, $file) or &error("Error", "Can't open password file: $!");
flock(IN,2);
seek(IN,0,0);
while (<IN>) {
chomp;
($name, $value, $tail) = split(/:/, $_, 3);
$hash{$name} = $value;
$tail{$name} = $tail; # maintain any additional fields
}
close IN;
}
# Salt for crypt
@range = ('0'..'9','a'..'z','A'..'Z','.','/');
srand ( time() ^ ($$ + ($$ << 15)) );
$salt = $range[rand(int($#range)+1)] . $range[rand(int($#range)+1)];
# Check for valid password or existing user
$pass = $hash{$user} if $hash{$user};
$cpwd = crypt($pwd, $pass);
$admin = $hash{admin} && crypt($pwd, $hash{admin}) eq $hash{admin};
if (($command ne 'new') && ($admin || $pass && $cpwd eq $pass)) {
if ($command eq 'remove') {
delete($hash{$user}); delete($tail{$user});
$msg = "User <B>$user</B> was removed from password file.";
} elsif (!$pass) {
$msg = "WARNING! 'Change Password' checked for non-existing user?\n"
. "<P>Assigning password for new user <B>$user</B> anyway.\n"
. "<P>If this was an error, go back and 'Remove User'";
} else {
$msg = "Password has been updated for $user.";
}
} elsif ($FORM{command} eq 'new') {
if ($pass) {
&error("Sorry", "User <B>$user</B> is already assigned.");
}elsif ($allow_new || $admin) {
$msg = "Password has been assigned for new user $user.";
} else {
&begin_html("Sorry, New User");
print "Contact file owner for password you can change later.";
&end_html;
exit;
}
} else {
&error("Password Error",
"Invalid user or password or forgot to check 'New User'.");
}
# Assign new password to user and write to file
$hash{$user} = crypt($FORM{new}, $salt) if $command ne 'remove';
if (open(OUT, ">$file")) {
flock(OUT,2);
seek(OUT,0,0);
foreach $name (sort keys %hash) {
print OUT "$name:$hash{$name}";
print OUT ":$tail{$name}" if $tail{$name};
print OUT "\n";
}
} else {
&error("Error","Can't update password file: $!");
}
# Print Return HTML
&begin_html("Thank You");
print "$msg\n";
&end_html;
### Subroutines
#subroutine begin_html(title)
sub begin_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";
}
#subroutine end_html
sub end_html {
# Add footer links here
print "<P></body></html>\n";
}
#subroutine make_form
sub make_form {
&begin_html("Change password for Gerrit");
print <<NEW_FORM;
Use this form to change your password for access to Gerrit code review system.
<FORM METHOD="POST" ACTION="$ENV{SCRIPT_NAME}">
<DL>
<DT> Username:
<DD><INPUT NAME="user">
<DT> Current Password:
<DD><INPUT TYPE=PASSWORD NAME="old">
<DT> New Password:
<DD><INPUT TYPE=PASSWORD NAME="new">
<DT> Confirm New Password:
<DD><INPUT TYPE=PASSWORD NAME="new2">
<DT>Request:
<DD>
<INPUT TYPE="radio" NAME="command" VALUE="change" CHECKED> Change Password
</DL>
<P><INPUT TYPE="submit" VALUE=" Submit ">
</FORM>
NEW_FORM
&end_html;
exit;
}
sub error {
local($title,$msg) = @_;
&begin_html($title);
print "<P>$msg\n";
print "<P>Please check your name and re-enter passwords.\n";
&end_html;
exit;
}
htpasswd.cgi 网页远程修改gerrit ht 认证的密码文件的更多相关文章
- 远程修改VMware ESXi服务器的密码(SSH)
1,用vSphere client登录到服务器,将SSH启用. 2,使用ssh连接工具(我用的是secureCRT)远程登录,输入passwd,键入两次新密码,OK.
- windows7使用Source insight上远程修改ubuntu共享内核源码
由于本人阅读喜欢使用source insight.前段时间接触了linux核代码,而这份代码只能放在ubuntu服务器上编译,刚开始的时候是在windows上修改,完了之后再copy到服务器上去编译, ...
- 树莓派3b+ Ubuntu 16.04 MATA系统 ssh远程登陆后修改主机名、用户密码和用户名
写在前面: 刚刚开始写博客,记录下自己的学习过程,备忘. 最近在使用树莓派做智能小车的开发,使用的是树莓派3b+,安装的是Ubuntu 16.04 MATA 系统,安装系统后需要修改主机名,登陆密码以 ...
- UE没法远程修改文件
UE没法远程修改文件修改ftp和sftp修改方式都没有作用,考虑可能是防火墙的作用,关闭防火墙可以.于是在控制面板->防火墙->修改策略中将UE的公用网络打开.
- Linux学习总结(三)之 putty,xshell远程连接及密钥认证篇
一:putty 下载 1:认准两个地方 a. Download putty b. chiark greenend 2:下载32位的zip包,这是一个工具包合集,不单是一个终端工具 二:putty设置 ...
- exsi6.0远程修改密码
-------------------------------esxi远程修改root密码--------------------------- 在不接触物理机时,通过启动ssh服务,远程修改密码,具 ...
- cas 3.5.3服务器搭建+spring boot集成+shiro模拟登录(不修改现有shiro认证架构)
因为现有系统外部接入需要,需要支持三方单点登录.由于系统本身已经是微服务架构,由多个业务独立的子系统组成,所以有自己的用户认证微服务(不是cas,我们基础设施已经够多了,现在能不增加就不增加).但是因 ...
- Python + Selenium +Chrome 批量下载网页代码修改【新手必学】
Python + Selenium +Chrome 批量下载网页代码修改主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt来达到在登陆状态下 批量打开并下载网页, ...
- windows系统远程修改密码
1.需求:公司需要短时间.批量修改一些windows系统的管理员密码: 2.准备工作: a.下载软件:链接:https://pan.baidu.com/s/1kV52DqE1_4siPuxS5Mosc ...
随机推荐
- 转:shell 经典, shell 十三问
原文链接:http://blog.csdn.net/freexploit/article/details/626660 我在 CU 的日子并不长,有幸在 shell 版上与大家结缘.除了跟众前辈学 ...
- 关于group by
<pre name="code" class="sql">关于group by 排序问题 10g 以前sort group by 需要排序 10g ...
- 奇葩的SQL*Net more data from client等待,导致批处理巨慢
<pre name="code" class="sql"><pre name="code" class="sql ...
- Android ExpandableListActivity的简单介绍及小例子
Android中常常要用到ListView,但也经常要用到ExpandableListView,ListView是显示列表,而ExpandableListView显示的是分类的列表: 下面用一个例子来 ...
- JAVA获取oracle中sequences的最后一个值
项目中,用到一个序列作单号,框架用的是ssh,在dao层去拿的时候,运行时报错为dual is not mapped,[select *.nextval nextvalue from dual] 后来 ...
- 如何在 Android 手机上实现抓包?
如何在 Android 手机上实现抓包? http://www.zhihu.com/question/20467503 我想知道某个应用究竟在数据提交到哪里,提交了什么.网上的教程太复杂,不想麻烦.有 ...
- jps命令使用
jps工具 jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前全部java进程pid的命令,简单有用,很适合在linux/un ...
- Makefile学习(一)变量
鉴于之前有一些了解,还有自己的学习习惯,我一上来就看Makefile的变量这一章.主要脉络是根据GNU make中文手册. 第六章:Makefile中的变量 6使用变量 定义:变量是一个名字,代表一个 ...
- Hacker(17)----认识Windows系统漏洞
Windows系统是迄今为止使用频率最高的操作系统,虽然其安全性随着版本的更新不断提高,但由于人为编写的缘故始终存在漏洞和缺陷.但Mircosoft公司通过发布漏洞补丁来提高系统的安全性,使Windo ...
- UTF8转GB2312(UTF8解码)
小弟C++上手没多久,代码不严谨之处敬请见谅.英语也不是很好,有的是直接使用的拼音. string MyUTF_8toGB2312(string str) { ,,str.c_str(),-,NULL ...