十七 多线程并发访问ssh

• 编写脚本程序

  1. 在文件中取出所有远程主机IP地址
  2. 在shell命令行中接受远程服务器IP地址文件、远程服务器密码以及在远程主机上执行的命令
  3. 通过多线程实现在所有的远程服务器上并发执行命令

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操作更快更效率

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页