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. Spring Cloud断路器Hystrix

    在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就会因依赖关系形成故障蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构就更加的不稳定.为了解决这样的问题,因此产生了断路器模式. 什么是 ...

  2. iframe 跨域调用父级方法的方案

    一.如果高层域名相同的话,可以通过document.domain来实现跨域访问 例如: 父级域名:localhost:8080 子级域名:localhost:9090 那么可以设置document.d ...

  3. JDK提供的四种线程池代码详解

    一.线程池什么时候使用,会给我们带来什么好处? 如果很多用户去访问服务器,用户访问服务器的时间是非常短暂的,那么有可能在创建线程和销毁线程上花费的时间会远远大于访问所消耗的时间,如果采用线程池会使线程 ...

  4. dubbo-001--前言

    1,前言: 第一次了解dubbo是在15年刚工作的时候在瑞友,项目是给凯撒旅游公司签证部做一个签证系统,项目需要调用一些凯撒的方法,比如权限.部门信息,跟签证相关的一些如签证国家城市.领区啥玩意的,等 ...

  5. Numpy 常用矩阵计算函数

    基本属性 在做一些数据分析的时候,我们通常会把数据存为矩阵的形式,然后python本身对于矩阵的操作是不够的,因此出现了numpy这样一个科学开发库来进行python在次上面的不足. Numpy's ...

  6. 使用Docker发布应用

    新建spring boot应用demo-docker,添加web依赖 <dependency> <groupId>org.springframework.boot</gr ...

  7. 确保线程安全下使用Queue的Enqueue和Dequeue

    场景是这样,假设有一台设备会触发类型为Alarm的告警信号,并把信号添加到一个Queue结构中,每隔一段时间这个Queue会被遍历检查,其中的每个Alarm都会调用一个相应的处理方法.问题在于,检查机 ...

  8. wordpress添加面包屑

    第一步:在functions.php中添加如下代码 // 面包屑导航 function get_breadcrumbs() { global $wp_query; if ( !is_home() ){ ...

  9. 如果非得了解下git系统... - 实践篇

    git的定义是一个内容寻址文件系统.内容.寻址.文件.系统,该来的总会来的… 本文旨在通过实践来介绍.git文件夹中的目录及文件功能,属git基础知识.但在此基础上可解决各git使用过程中可能遇到的问 ...

  10. Chapter 3 Phenomenon——21

    "Nobody will believe that, you know." “你知道吗没有人会相信会是这样的” His voice held an edge of derision ...