1.首先本文是在一篇百度经验的基础上修改而成,将网址记录上,以示尊重。

https://jingyan.baidu.com/article/48b37f8dd4bbb31a646488c2.html

2.设计思想

SVN的用户密码都保存在一个密码文件中,SVN管理员通过调用htpasswd命令来实现用户密码的新增,修改。

自助用户修改的设计思想就是把这个密码文件修改方法公共给用户们使用; 具体的说,就是一个CGI网页来封装htpasswd修改用户命令,用户在网页上输入新用户密码后,CGI调用htpasswd命令来修改用户。

至于为什么要用CGI,哈哈,因为简单啊,Perl在Linux上原生就有,不用安装。

如果你熟PHP,那你就用PHP来封装,如果你熟JAVA那你就JAVA封装,原理都一样

最关键的那个命令:

/usr/bin/htpasswd -b $authuserfile $User $UserNewPwd

$authuserfile 密码文件所在路径,必须是绝对路径

$User 用户名

$UserNewPwd 用户新密码

2.安装Perl的CGI库

yum install perl-CGI

3.创建Cig配置文件

cd /var/www/cgi-bin

vi ChangePasswd.ini

[path]
authuserfile=/data/svn/conf/http_passwd
logfile=/var/www/cgi-bin/ChangePasswd.log
[setup]
pwdminlen=6
[html]
title=SVN Password Modification
description=SVN Password Modification
yourname=User Name
oldpwd=Old Password
newpwd1=New Password
newpwd2=Confirm New Password
btn_change=Modification
btn_reset=Reset changepwdok=Password reset complete
changepwdfailed=Password modification failed
servererror=Server error, please contact the administrator
passmustgreater=The new password digit must be greater than 6 digits
twopassnotmatched=Two password entries must be the same
entername=Please enter your username
enterpwd=Please enter your password
errorpwd=Your password is incorrect
back=Back

4.创建CGI文件

注:我隐去了原有密码校验

cd /var/www/cgi-bin

vi 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 = "PASSWD CAN'T BE ALL NUMBERS";

my $pwd_not_allchar = "PASSWD CAN'T BE ALL LETTERS";

my $user_not_exists ="USER DOES NOT EXIST";

my $file_not_found ="FILE DOES NOT EXIST,PLEASE CONTACT THE MANAGER";

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())

{#

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);}

else

{if($authuserfile)

{#

open UserFile, "<$authuserfile" or die "open file failed.$!";

while (<UserFile>)

    {#

       my $varstr=$_;

       if($varstr =~/($User)/)

    {#

     my $eqpos =index($varstr, ":");

     my $UserName = substr($varstr,,$eqpos);

     my $cryptpwd = substr($varstr,$eqpos + ,);

     next if($UserName ne $User);

     #if(crypt($UserPwd,$cryptpwd) eq $cryptpwd)
if() {#a my $rc = system("/usr/bin/htpasswd -b $authuserfile $User $UserNewPwd"); if ($rc == ) {# &Writer_Log( $User.".Change Passwd"); &otherhtml($title,$changepwdok,$back); }# else {# &Writer_Log( $User.".Change Passwd Failed"); &otherhtml($title,$changepwdfailed,$back); }# exit; }#a else {#b &Writer_Log("Old Passwd is Incorrect "); &otherhtml($title,$errorpwd,$back); }#b exit; }# else {# if(eof) { &Writer_Log($User.".no this user"); &otherhtml($title,$user_not_exists,$back); exit; } else {next;} }#4 }# close UserFile; }# else {# &Writer_Log($authuserfile.".no found"); &otherhtml($title,$file_not_found,$back); }# } }# else {&Index_Html;} sub IniInfo{ my $inifile = "/var/www/cgi-bin/ChangePasswd.ini"; open CGI_INI_FILE, "<$inifile" or die "open file failed.$!";; while (<CGI_INI_FILE>) { my $eqpos =index($_,'='); my $len = length($_); if ($_ =~/authuserfile/) {$authuserfile= substr($_, $eqpos + , $len - $eqpos -);} elsif ($_ =~/logfile/) {$logfile= substr($_, $eqpos + );} elsif ($_ =~/pwdminlen/) {$pwdminlen= substr($_, $eqpos + );} elsif ($_ =~/title/) {$title = substr($_, $eqpos + );} elsif ($_ =~/description/) {$description = substr($_, $eqpos + );} elsif ($_ =~/yourname/) {$yourname = substr($_, $eqpos + );} #elsif ($_ =~/oldpwd/) #{$oldpwd= substr($_, $eqpos + 1);} elsif ($_ =~/newpwd1/) {$newpwd1= substr($_, $eqpos + );} elsif ($_ =~/newpwd2/) {$newpwd2= substr($_, $eqpos + );} elsif ($_ =~/btn_change/) {$btn_change = substr($_, $eqpos + );} elsif ($_ =~/btn_reset/) {$btn_reset = substr($_, $eqpos + );} elsif ($_ =~/changepwdok/) {$changepwdok = substr($_, $eqpos + );} elsif ($_ =~/changepwdfailed/) {$changepwdfailed = substr($_, $eqpos + );} elsif ($_ =~/oldpwderror/) {$oldpwderror = substr($_, $eqpos + );} elsif ($_ =~/passmustgreater/) {$passmustgreater = substr($_, $eqpos + );} elsif ($_ =~/twopassnotmatched/) {$twopassnotmatched = substr($_, $eqpos + );} elsif ($_ =~/entername/) {$entername = substr($_, $eqpos + );} elsif ($_ =~/enterpwd/) {$enterpwd= substr($_, $eqpos + );} elsif ($_ =~/errorpwd/) {$errorpwd= substr($_, $eqpos + );} elsif ($_ =~/back/) {$back = substr($_, $eqpos + );} } 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> <HR> <center><h1>$description</h1> </center> <form method="POST" enctype="multipart/form-data" action="/cgi-bin/ChangePasswd.cgi"> <br> <TABLE> <TR><TD>$yourname</TD><TD><input type="text" name="UserName" /></TD></TR> <TR><TD>$newpwd1</TD><TD><input type="password" name="NewPwd1" /></TD></TR> <TR><TD>$newpwd2</TD><TD><input type="password" name="NewPwd2" /></TD></TR> </TABLE> <br> <TABLE> <TR><TD><input type="submit" name="chgpasswd" value="$btn_change"> <input type="reset" value="$btn_reset"></TD></TR> </TABLE> </form> <HR> <font color="#FF0000; charset=utf-8">WARNING:YOUR NEWPASSWD MUST MORE THAN $pwdminlen CHARACTERS.</font> </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>$_[]</title> </head> <body> <p><font size="5">$_[]</font></p> <p><a href="/cgi-bin/ChangePasswd.cgi"><font size="4">$_[]</font></a></p> <HR> </body> </html> END_OF_PAGE } sub Writer_Log{ if($logfile) { my $loginfo ="[".$time."] "." [".$remote_id."] "." || ".$_[]; open LOGFILE,">>$logfile" or die "Couldn't open LOG FILE for writing: $!"; print LOGFILE ("$loginfo\n"); close LOGFILE; } }

5.设置文件权限和建立日志文件

cd /var/www/cgi-bin

touch ChangePasswd.log

chmod 755 ChangePasswd.cgi

chmod 666 ChangePasswd.log

6.重启Httpd服务

service httpd restart

7.验证功能

http://<SVN服务器IP>/cgi-bin/ChangePasswd.cgi

8.问题解决

服务器防火墙要关闭

服务器SeLinux服务要关闭

enjoy :)

在Linux上实现SVN用户密码自助修改的更多相关文章

  1. Linux系统下超级用户密码的修改

    1)重启系统:在虚拟机刚启动界面,不停地按上下键,停止系统的自动引导(界面底部有提示) 2) 按 e 进入编辑模式 3) 编辑内容如下:完成后按Ctrl+x    (具体编辑内容为下图:删除倒数第三行 ...

  2. 通过web修改svn用户密码

    使用方法: 将文件changePasswd.cgi和changePasswd.ini 放到apche安装目录下的cgi-bin下(cgi-bin的目录可以通过/etc/httpd/conf/httpd ...

  3. Linux上部署SVN

    Linux上部署SVN author:headsen chen  2017-10-16  16:45:04 前提:通过yum来安装,必须是centos6.5的桌面版的.否则会出现某些的安装包不全而导致 ...

  4. 很实用的linux 上的svn安装和svnserver 的重启

    虽然在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,所以今天这篇文章就来一步一步教您如何在Centos上搭建SVN 安装 #yu ...

  5. (转载)如何借助KeePassX在Linux上管理多个密码

    转自:http://netsecurity.51cto.com/art/201311/417764.htm 如今,基于密码的身份验证在网上非常普遍,结果你恐怕数不清自己到底在使用多少个密码.实际上,据 ...

  6. Linux系统重置root用户密码

    Linux系统重置root用户密码 作者:Eric 微信:loveoracle11g 查看系统版本是不是RHEL7 [root@zhouwanchun ~]# cat /etc/redhat-rele ...

  7. CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址、服务启动等)

    CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址.服务启动等) 原 一事能狂便少年 发布于 2016/12/27 11:16 字数 1113 阅读 1.3K  收藏 0 ...

  8. Linux上搭建SVN服务

    环境:centos7 一.搭建svn服务 1. 安装svn yum -y install subversion 2. 创建一个目录作为svn服务的地址(svn://192.168.0.2:3690 访 ...

  9. 在Linux上安装SVN服务

    1.安装SVNyum install subversion 2.查看版本svnserve --version3.创建目录mkdir -p /web/svndata3.创建repo测试库svnadmin ...

随机推荐

  1. Git安装学习记录

    1.下载: https://gitforwindows.org/ 2.安装:https://blog.csdn.net/chengyuqiang/article/details/54178683 3. ...

  2. js 标准二维数组变一维数组的方法

    问题:[[0, 1], [2, 3], [4, 5]] -> [0, 1, 2, 3, 4, 5]? 方法一 利用es5的arr.reduce(callback[, initialValue]) ...

  3. CSS中text-shadow的几个好看的文字demo及其代码

    最近有看到一些镂空的或者立体的文字设计图非常好看,然后想了想,应该是使用text-shadow来实现的,这里我贴出我仿的八个demo,分享给大家 首先是HTML代码 <div class=&qu ...

  4. 优化openfire服务器提升xmpp 效率的15个方法(原创)

    1.禁用原生xmpp搜索,使组织架构.人员数据本地化保存,并使客户端数据同步服务器,降低原生xmpp搜索的iq消耗,因为搜索是im应用的频繁操作: 2.禁用roster花名册.禁用presence包通 ...

  5. captcha ~ 生成验证码图片

    验证码在我们的世界中可以保护我们的信息安全的一个保障之一 这就是生成验证码的代码     # 导报 from captcha.image import ImageCaptcha #验证码的包 from ...

  6. 好用的在线工具汇总:Iconfont图标,数据mock,时间函数库,颜色查询 等

    一   时间函数库 ———http://momentjs.com/ 非常全的时间处理函数库,引入使用非常方便. 二   Iconfont———http://www.iconfont.cn/ 各种小图标 ...

  7. Redis学习系列三List列表

    一.简介 Redis中的列表相当于C#中的LinkedList,也就是链表,如果你研究过链表这个数据结构,肯定知道.它的插入和删除是非常快的,但是定位却很慢,因为必须遍历所有的元素,才能找到对应的值, ...

  8. Shell 流程控制 if while for

    if else if if 语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if [ $(p ...

  9. C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)

     说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...

  10. flex布局中transform出错

    在flex布局下,若应用transform 的动画的子元素没有使用进行定位,则动画过程中,子元素将相对display:flex的元素进行static定位 动画结束后位置正常: 修复代码只需要posit ...