在Linux上实现SVN用户密码自助修改
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用户密码自助修改的更多相关文章
- Linux系统下超级用户密码的修改
1)重启系统:在虚拟机刚启动界面,不停地按上下键,停止系统的自动引导(界面底部有提示) 2) 按 e 进入编辑模式 3) 编辑内容如下:完成后按Ctrl+x (具体编辑内容为下图:删除倒数第三行 ...
- 通过web修改svn用户密码
使用方法: 将文件changePasswd.cgi和changePasswd.ini 放到apche安装目录下的cgi-bin下(cgi-bin的目录可以通过/etc/httpd/conf/httpd ...
- Linux上部署SVN
Linux上部署SVN author:headsen chen 2017-10-16 16:45:04 前提:通过yum来安装,必须是centos6.5的桌面版的.否则会出现某些的安装包不全而导致 ...
- 很实用的linux 上的svn安装和svnserver 的重启
虽然在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,所以今天这篇文章就来一步一步教您如何在Centos上搭建SVN 安装 #yu ...
- (转载)如何借助KeePassX在Linux上管理多个密码
转自:http://netsecurity.51cto.com/art/201311/417764.htm 如今,基于密码的身份验证在网上非常普遍,结果你恐怕数不清自己到底在使用多少个密码.实际上,据 ...
- Linux系统重置root用户密码
Linux系统重置root用户密码 作者:Eric 微信:loveoracle11g 查看系统版本是不是RHEL7 [root@zhouwanchun ~]# cat /etc/redhat-rele ...
- CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址、服务启动等)
CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址.服务启动等) 原 一事能狂便少年 发布于 2016/12/27 11:16 字数 1113 阅读 1.3K 收藏 0 ...
- Linux上搭建SVN服务
环境:centos7 一.搭建svn服务 1. 安装svn yum -y install subversion 2. 创建一个目录作为svn服务的地址(svn://192.168.0.2:3690 访 ...
- 在Linux上安装SVN服务
1.安装SVNyum install subversion 2.查看版本svnserve --version3.创建目录mkdir -p /web/svndata3.创建repo测试库svnadmin ...
随机推荐
- Tree with Small Distances(cf1029E)(树形动规)
You are given an undirected tree consisting of \(n\) vertices. An undirected tree is a connected und ...
- Redis中的批量操作Pipeline
大多数情况下,我们都会通过请求-相应机制去操作redis.只用这种模式的一般的步骤是,先获得jedis实例,然后通过jedis的get/put方法与redis交互.由于redis是单线程的,下一次请求 ...
- 脚本中 if 判断细节
if [[ $1 == "fedora" ]];then echo "redhat" elif [[ $1 == "redhat" ]];t ...
- Android学习总结——INSTALL_FAILED_CONFLICTING_PROVIDER
在写个小demo的时候出现了这个问题: 排除手机内存不足.以及没用安装过这个应用的问题之后,发现是android:authorities="..."出了问题,可能还有其他应用程序和 ...
- 使用Java客户端对Redis进行操作
一.背景 上篇文章我们介绍了如何在centos7下面进行安装单机版redis以及redis集群.这篇文章,我们来聊一聊如何使用java客户端来进行操作redis.我们知道redis的java客户端有很 ...
- div或其他html控件的overflow使用滚动条
在编写html代码时, 有时候不想把控件撑大,滚动条就是个不错的选择 如下代码 <div style="height:auto !important;max-height:58px;o ...
- Excelbatis-一个将excel文件读入成实体列表、将实体列表解析成excel文件的ORM框架,简洁易于配置、可扩展性好
欢迎使用Excelbatis! github地址:https://github.com/log4leo/Excelbatis Excelbatis的优点 和spring天然结合,易于接入 xsd支持, ...
- 核心组件之SecurityContextHolder
作用:保留系统当前的安全上下文细节,其中就包括当前使用系统的用户的信息. 上下文细节怎么表示? 用SecurityContext对象来表示 每个用户都会有它的上下文,那这个Securi ...
- 分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致
打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...
- Java 集合并交补
示例 package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.Collec ...