十七 多线程并发访问ssh
程序员文章站
2024-03-19 13:48:40
...
• 编写脚本程序
- 在文件中取出所有远程主机IP地址
- 在shell命令行中接受远程服务器IP地址文件、远程服务器密码以及在远程主机上执行的命令
- 通过多线程实现在所有的远程服务器上并发执行命令
import paramiko # 需要安装paramiko模块
import sys
import getpass
import threading
import os
def rcmd(host, user='root', passwd=None, port=22, command=None):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=passwd, port=port)
stdin, stdout, stderr = ssh.exec_command(command)
out = stdout.read()
err = stderr.read()
if out:
print('[\033[34;1m%s\033[0m] \033[32;1mOUT\033[0m:\n%s' % (host, out.decode()))
if err:
print('[\033[34;1m%s\033[0m] \033[31;1mERROR\033[0m:\n%s' % (host, err.decode()))
ssh.close()
if __name__ == '__main__':
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: %s' % sys.argv[1])
exit(2)
ipfile = sys.argv[1] # 选取文件,文件内是IP地址
command = sys.argv[2] # 输入命令,比如id root
passwd = getpass.getpass() # 隐藏密码输入,各ip地址密码要一致
with open(ipfile) as fobj:
for line in fobj:
ip = line.strip() # 去除行尾的\n,得到IP地址
t = threading.Thread(target=rcmd, args=(ip,), kwargs={'passwd': passwd, 'command': command})
t.start()
这其实就是现在流行的ansible,用ansible操作更快更效率
上一篇: MD5加密工具类
下一篇: SpringSecurity