欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

十七 多线程并发访问ssh

程序员文章站 2024-03-19 13:48:40
...

• 编写脚本程序

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

上一篇: MD5加密工具类

下一篇: SpringSecurity