虽然现在 Git 已经很普及, 但是我相信用 SVN 的公司仍然不少, 那么作为 SVN 配置管理员的话, 就不可避免的涉及到账号维护的问题, 今天我们就说说如何通过 Python 脚本实现用户的快捷维护.
如果手动维护用户, 一般需要三个步骤:
1. 手动添加用户
2. 手动设置属组
3. 通知用户设置结果
使用脚本后也是三步, 但是效率却大大提升:
1. 输入用户名
2. 输入要设置的组名
3. 按下回车, 搞定
这里面设置用户和属组是关键点, 也是我们需要自动化起来的操作, 下面分别给出实现的代码:
- def add_user(user_name):
- """如果用户不存在则调用 htpasswd.exe 添加用户"""
- htpasswd_path = cur_file_dir() + '\\bin\\htpasswd.exe -b'
- pwd_path = REP_PATH + '\\htpasswd'
- user_list = readfiles(REP_PATH + '\\htpasswd')
- for line in user_list.split('\n'):
- if ':' in line and user_name.lower() == line.split(':')[0]:
- print('用户' + user_name + '已存在, 不需要创建')
- return "见之前邮件通知"
- pwd = 'sylan215@' + str(random.randrange(1000, 9999, 1))
- print(execut_ret(htpasswd_path + pwd_path + user_name + pwd)[1])
- return pwd.strip()
- 这段是创建用户的代码, 下面做下说明:
- cur_file_dir() 函数功能是获取执行脚本所在路径;
- htpasswd.exe 是从 Apache 目录拷贝出来的工具, 可以在指定文件添加指定的用户名和密码信息, 命令行使用方法htpasswd.exe -b [密码文件] [用户名] [密码], 更多使用说明请 Google;
- REP_PATH 是我定义的一个全局变量, 是我 SVN 仓库的根目录, 目录下会存放用户和组设置的配置文件;
- htpasswd 文件就是上面说的用户信息存储文件;
- pwd 是我通过随机数生成的以 sylan215@ 开头的 13 位密码;
- execut_ret() 函数功能是执行指定程序并返回执行结果的, 目前就是执行 htpasswd.exe 添加指定用户信息;
- 接着我们来看看设置组信息的代码:
- def add_group(user_name, user_grp):
- """添加用户到指定用户组"""
- grp_path = REP_PATH + "\\groups.conf"
- grp_context = readfiles(grp_path)
- new_context = ""
- isadd = False
- for line in grp_context.split('\n'):
- if '=' in line and user_grp.lower() == line.split('=')[0].lower():
- if user_name.lower() in line.lower():
- print("用户" + user_name + "已经属于" + user_grp)
- return False
- if line.split('=')[1] != '':
- new_line = line + "," + user_name
- else:
- new_line = line + user_name
- new_context = grp_context.replace(line, new_line)
- isadd = True
- break
- if isadd:
- writetofile(grp_path, new_context)
- print("用户" + user_name + "成功添加到组" + user_grp)
- return True
- else:
- print("组设置失败, 请检查组名是否正确")
- return True
- 对这个函数的说明:
- 本函数功能就是读取组设置文件 groups.conf, 检查当前用户是否存在于目标组里面, 如果存在直接返回, 否则添加用户到组里面;
- readfiles() 函数功能是一次读出目标文件的所有内容;
- writetofile() 函数功能是把指定内容写入指定文件;
- 下面是最后的统一调用函数, 以及入口函数实现:
- def useradd(user_name, user_grp):
- """"添加用户 + 添加属组 + 邮件通知"""
- ret_grp = False
- pwd = add_user(user_name)
- if ',' in user_grp:
- for each_group in user_grp.split(','):
- if add_group(user_name, each_group):
- ret_grp = True
- elif add_group(user_name, user_grp):
- ret_grp = True
- if ret_grp:
- sendcontextmail(user_name, pwd, user_grp)
- if __name__ == "__main__":
- while True:
- user_name = input("请输入用户名 (多个用户请用英文逗号分隔):")
- user_group = input("请输入要加入的属组 (多个组请用英文逗号分隔):")
- for usr in user_name.split(','):
- useradd(usr, user_group)
- 说明:
- sendcontextmail() 函数是公用的邮件通知函数;
- 统一处理函数可以处理一个用户添加多个用户组的情况;
- 入口函数可以处理多个用户同时添加的情况, 并且做了无限循环, 这样把窗口挂在服务器上可以随取随用了;
- 上述代码是基于 Python3.4 验证通过的, 其他版本应该同理;
- 上述说明是基于 Windows 进行实现的;
- 上述实现是基于 SVN 自带的账号和组管理系统的;
- 如果是基于 Windows 的账号和组设置体系, 代码上比这个简单:
- def useradd(username, usergroup):
- """添加 windows 账号, 并设置属组"""
- pwd = 'sylan215@' + str(random.randrange(1000, 9999, 1))
- retinfo = execut_ret('net.exe user' + username + pwd + '/add')
- if '命令成功完成' not in retinfo[0]:
- print('用户已创建失败:' + retinfo[1])
- print('用户创建成功:' + username)
- print('随机密码:' + pwd)
- for groupname in usergroup.split(','):
- retinfo = execut_ret('net.exe localgroup' +
- groupname + '' + username +' /add')
- if '命令成功完成' not in retinfo[0]:
- print('设置用户属组失败:' + retinfo[1])
- print('用户已加入属组:' + groupname)
- sendcontextmail(username, pwd, usergroup)
好了, 通过这么少的代码就可以瞬间搞定用户配置问题, 维护起来是不是 so easy 了 (如果有同学需要完整代码, 请在公众号后台撩我哈).
来源: http://blog.51cto.com/sylan215/2149345