'''
* 批量删除Linux用户
* 实现思路:1.通过with语句读取/etc/passwd的每行内容,用splitlines方法去除\n,存入列表中,此时的列表为列表中嵌套了列表
2.遍历上述列表,用split方法将以冒号为分隔符的用户信息的每列提取为单个字符,再存入新的列表中
3.设定条件来筛选需要删除的用户,放入del_user列表,遍历该列表,通过subprocess方法删除用户
'''
from subprocess import run
#user_list = [['a2:x:1011:1011::/home/a2:/bin/bash'], ['a3:x:1012:1012::/home/a3:/bin/bash']] #测试用
#读取文件每行内容,去除\n,存入列表
def user_info():
user_list = []
all_user = []
with open('/etc/passwd') as f:
for each in f:
user_list.append(each.splitlines()) #生成一个嵌套列表
#如[['a2:x:1011:1011::/home/a2:/bin/bash'], ['a3:x:1012:1012::/home/a3:/bin/bash']]
#以冒号为分隔符,把每用户信息的每列提取为单个字符
for i in range(len(user_list)):
buf_user = str(user_list[i][0]).split(':') #列表需先转为字符串
#如:['a2', 'x', '1011', '1011', '', '/home/a2', '/bin/bash']
all_user.append(buf_user) #将列表追加到列表中
return all_user
#print(user_info()[0][6])
#筛选用户存入del_user列表,结合条件并删除用户
def delete_user(all_user,uvalue,bash):
count = 0 #统计循环次数,标记筛选出的用户
del_user = [] #将需要删除的用户放入列表
for i in all_user:
uid = int(i[2]) #列表的第三个元素为UID
ushell = i[6] #列表的第7个元素为解释器
if uid > uvalue and ushell == bash:
del_user.append(all_user[count][0])
count += 1
if not del_user:
print('\033[33m无可删除的用户\033[0m')
return 71
#通过subprocess模块删除用户
for i in del_user:
rc = run('userdel -r %s' % i,shell=True)
if not rc.returncode:
print('\033[96m%s删除成功\033[0m' % i)
else:
print('\033[31m%s删除失败\033[0m' % i)
#####################################主程序#####################################
if __name__ == '__main__':
delete_user(user_info(), 1000, '/bin/bash')