需求:
服务器数量达到七百多台,由于前期管理不当,导致很多root用户密码不正确了。但庆幸的是拥有sudo权限的普通用户密码都是对的。现在需要使用普通用户批量修改root密码。
技术:
果断采用了python的paramiko来完成。主要是笔者实在不想写shell了。
难点:
sudo提权时如何输入密码
passwd执行时多次输入导致僵死问题
写代码:
import paramiko
def get_client(hostname, port, username, password):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, port, username, password)
return client
def exec_command(client, cmd, ssh_password):
stdin, stdout, stderr = client.exec_command(cmd, get_pty=True)
stdin.write(ssh_password+"\n")
stdin.flush()
out = stdout.read().decode().strip()
if out != '':
print(out)
err = stderr.read().decode().strip()
if err != '':
print(err)
ip_list = []
f = open('server.txt')
for line in f.readlines():
ip_list.append(line.strip())
f.close()
for index, ip in enumerate(ip_list):
print('%s - %s' %(index, ip))
client = None
try:
client = get_client(ip, 22, 'ssh_user', 'ssh_password')
cmd_str = "echo new_root_password | sudo passwd --stdin root"
exec_command(client, cmd_str, 'ssh_password')
except Exception as e:
print(e)
finally:
if client is not None:
client.close()
server.txt里面就是一个个的ip列表,一个ip一行。
注意:通过echo方式修改密码,不是很安全。因为这条命令可能会被人在history中看到。记得清除记录history -c。
如果echo 字符里面带有“!”符号记得转义“!”否则会导致修改后的密码并不是你想要的值。