雖然現(xiàn)在 Git 已經(jīng)很普及,但是我相信用 SVN 的公司仍然不少,那么作為 SVN 配置管理員的話(huà),就不可避免的涉及到賬號(hào)維護(hù)的問(wèn)題,今天我們就說(shuō)說(shuō)如何通過(guò) Python 腳本實(shí)現(xiàn)用戶(hù)的快捷維護(hù)。
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、迭部網(wǎng)站維護(hù)、網(wǎng)站推廣。
如果手動(dòng)維護(hù)用戶(hù),一般需要三個(gè)步驟:
1.手動(dòng)添加用戶(hù)
2.手動(dòng)設(shè)置屬組
3.通知用戶(hù)設(shè)置結(jié)果
使用腳本后也是三步,但是效率卻大大提升:
1.輸入用戶(hù)名
2.輸入要設(shè)置的組名
3.按下回車(chē),搞定
這里面設(shè)置用戶(hù)和屬組是關(guān)鍵點(diǎn),也是我們需要自動(dòng)化起來(lái)的操作,下面分別給出實(shí)現(xiàn)的代碼:
def add_user(user_name):
"""如果用戶(hù)不存在則調(diào)用htpasswd.exe添加用戶(hù)"""
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('用戶(hù) ' + user_name + ' 已存在,不需要?jiǎng)?chuàng)建')
return "見(jiàn)之前郵件通知"
pwd = ' sylan215@' + str(random.randrange(1000, 9999, 1))
print(execut_ret(htpasswd_path + pwd_path + user_name + pwd)[1])
return pwd.strip()
這段是創(chuàng)建用戶(hù)的代碼,下面做下說(shuō)明:
cur_file_dir() 函數(shù)功能是獲取執(zhí)行腳本所在路徑;
htpasswd.exe 是從 Apache 目錄拷貝出來(lái)的工具,可以在指定文件添加指定的用戶(hù)名和密碼信息,命令行使用方法「htpasswd.exe -b [密碼文件] [用戶(hù)名] [密碼]」,更多使用說(shuō)明請(qǐng) Google;
REP_PATH 是我定義的一個(gè)全局變量,是我 SVN 倉(cāng)庫(kù)的根目錄,目錄下會(huì)存放用戶(hù)和組設(shè)置的配置文件;
htpasswd 文件就是上面說(shuō)的用戶(hù)信息存儲(chǔ)文件;
pwd 是我通過(guò)隨機(jī)數(shù)生成的以 sylan215@ 開(kāi)頭的 13 位密碼;
execut_ret() 函數(shù)功能是執(zhí)行指定程序并返回執(zhí)行結(jié)果的,目前就是執(zhí)行 htpasswd.exe 添加指定用戶(hù)信息;
接著我們來(lái)看看設(shè)置組信息的代碼:
def add_group(user_name, user_grp):
"""添加用戶(hù)到指定用戶(hù)組"""
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("用戶(hù) " + user_name + " 已經(jīng)屬于 " + 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("用戶(hù) " + user_name + " 成功添加到組 " + user_grp)
return True
else:
print("組設(shè)置失敗,請(qǐng)檢查組名是否正確")
return True
對(duì)這個(gè)函數(shù)的說(shuō)明:
本函數(shù)功能就是讀取組設(shè)置文件 groups.conf,檢查當(dāng)前用戶(hù)是否存在于目標(biāo)組里面,如果存在直接返回,否則添加用戶(hù)到組里面;
readfiles() 函數(shù)功能是一次讀出目標(biāo)文件的所有內(nèi)容;
writetofile() 函數(shù)功能是把指定內(nèi)容寫(xiě)入指定文件;
下面是最后的統(tǒng)一調(diào)用函數(shù),以及入口函數(shù)實(shí)現(xiàn):
def useradd(user_name, user_grp):
""""添加用戶(hù)+添加屬組+郵件通知"""
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("請(qǐng)輸入用戶(hù)名(多個(gè)用戶(hù)請(qǐng)用英文逗號(hào)分隔):")
user_group = input("請(qǐng)輸入要加入的屬組(多個(gè)組請(qǐng)用英文逗號(hào)分隔):")
for usr in user_name.split(','):
useradd(usr, user_group)
說(shuō)明:
sendcontextmail() 函數(shù)是公用的郵件通知函數(shù);
統(tǒng)一處理函數(shù)可以處理一個(gè)用戶(hù)添加多個(gè)用戶(hù)組的情況;
入口函數(shù)可以處理多個(gè)用戶(hù)同時(shí)添加的情況,并且做了無(wú)限循環(huán),這樣把窗口掛在服務(wù)器上可以隨取隨用了;
上述代碼是基于 Python3.4 驗(yàn)證通過(guò)的,其他版本應(yīng)該同理;
上述說(shuō)明是基于 Windows 進(jìn)行實(shí)現(xiàn)的;
上述實(shí)現(xiàn)是基于 SVN 自帶的賬號(hào)和組管理系統(tǒng)的;
如果是基于 Windows 的賬號(hào)和組設(shè)置體系,代碼上比這個(gè)簡(jiǎn)單:
def useradd(username, usergroup):
"""添加 windows 賬號(hào),并設(shè)置屬組"""
pwd = ' sylan215@' + str(random.randrange(1000, 9999, 1))
retinfo = execut_ret('net.exe user ' + username + pwd + ' /add')
if '命令成功完成' not in retinfo[0]:
print('用戶(hù)已創(chuàng)建失?。? + retinfo[1])
print('用戶(hù)創(chuàng)建成功:' + username)
print('隨機(jī)密碼:' + pwd)
for groupname in usergroup.split(','):
retinfo = execut_ret('net.exe localgroup ' +
groupname + ' ' + username + ' /add')
if '命令成功完成' not in retinfo[0]:
print('設(shè)置用戶(hù)屬組失敗:' + retinfo[1])
print('用戶(hù)已加入屬組:' + groupname)
sendcontextmail(username, pwd, usergroup)
好了,通過(guò)這么少的代碼就可以瞬間搞定用戶(hù)配置問(wèn)題,維護(hù)起來(lái)是不是 so easy 了(如果有同學(xué)需要完整代碼,請(qǐng)?jiān)诠娞?hào)后臺(tái)撩我哈)。
本文原創(chuàng)發(fā)布于公眾號(hào)「sylan215」,十年測(cè)試?yán)媳脑瓌?chuàng)干貨,關(guān)注我,漲姿勢(shì)!