通过多线程实现在所有的远程服务器上并发执行命令
import paramiko
import sys
import getpass
import os
import threading
#位置参数在前,其他关键字在后
def rcmd(host,user='root',passwd=None,port=22,cmd=None):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh.connect(host,username=user,port=port,password=passwd)
stdin,stdout,stderr = ssh.exec_command(cmd)
out = stdout.read()
err = stderr.read()
if out: # 如果有输出
print('[\033[32;1m%s\033[0m] OUT:\n%s' % (host, out.decode()))
if err:
print('[\033[31;1m%s\033[0m] ERROR:\n%s' % (host, err.decode()))
ssh.close()
if __name__ == '__main__':
# rcmd('192.168.1.137', passwd='123456', cmd='id root; id zhangsan')
if len(sys.argv) != 3:
print("Usage: %s ipfile 'command'" %sys.argv[0])
exit(1)
if not os.path.isfile(sys.argv[1]):
print('No such file:', sys.argv[1])
exit(2)
ipfile = sys.argv[1]
cmd = sys.argv[2]
passwd = getpass.getpass()
with open(ipfile) as fobj:
for line in fobj:
ip = line.strip() #取出行尾的\n
# rcmd(ip,passwd=passwd,cmd=cmd)
t = threading.Thread(
target=rcmd,args=(ip,),
kwargs={'passwd':passwd,'cmd':cmd}
)
t.start() # rcmd(*args, **kwargs)
server.txt 存放需要连接的ip地址,批量远程连接,然后进行操作
]$ vim server.txt #这里以三台机器为例
192.168.1.4
192.168.1.5
192.168.1.6
]$ python3 passwd.py server.txt “echo 123456 | passwd --stdin root” #批量修改远程主机密码
Password:
[192.168.1.5] OUT:
Changing password for user root.
passwd: all authentication tokens updated successfully.
[192.168.1.4] OUT:
Changing password for user root.
passwd: all authentication tokens updated successfully.
[192.168.1.6] OUT:
Changing password for user root.
passwd: all authentication tokens updated successfully.
]$ ssh root@192.168.1.4
root@192.168.1.4’s password: