1. 程式人生 > >python3 實現多執行緒ssh 批量遠端執行命令

python3 實現多執行緒ssh 批量遠端執行命令

需要模組:paramiko

pip3 install  paramiko
import paramiko
import sys
import getpass

def rcmd (host,password,cmd,port=22,username='root'):

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #

    ssh.connect(host,username=username,password=password,port=port)

    stdin,stdout,stderr = ssh.exec_command(cmd)    #分別儲存,標準輸入,標準輸出,錯誤輸出

    data = stdout.read().decode('utf8')
    error = stderr.read().decode('utf8')

    if data:#如果存標準輸出,列印
        print('[%s:OUT]:\n%s' % (host,data))

    if error:
        print('[%s:ERROR]:\n%s' % (host,error))

    ssh.close()


if __name__ == '__main__':
    # rcmd('192.168.4.11','123456','useradd zzz')

    password = getpass.getpass()
    ips = sys.argv[1]
    with open(ips) as fobj:     #迴圈匯入地址
        for lines in fobj:
            ip = lines.strip()
            rcmd(ip,password,sys.argv[2])

多執行緒優化版:

import paramiko
import sys
import getpass
import threading
import os
def rcmd (host,password,cmd,port=22,username='root'):

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #

    ssh.connect(host,username=username,password=password,port=port)

    stdin,stdout,stderr = ssh.exec_command(cmd)    #分別儲存,標準輸入,標準輸出,錯誤輸出

    data = stdout.read().decode('utf8')
    error = stderr.read().decode('utf8')

    if data:#如果存標準輸出,列印
        print('[%s:OUT]:\n%s' % (host,data))

    if error:
        print('[%s:ERROR]:\n%s' % (host,error))

    ssh.close()


if __name__ == '__main__':

    if len(sys.argv) != 3:
        print('%s 引數使用不正確' % (sys.argv[0]))
        exit(1)

    password = getpass.getpass()

    ips = sys.argv[1]
    cmd = sys.argv[2]

    if not os.path.isfile(ips):
        print('找不到檔案!',ips)
        exit(2)

    with open(ips) as fobj:     #迴圈匯入地址
        for lines in fobj:
            ip = lines.strip()
            t = threading.Thread(target=rcmd,args=(ip,password,cmd))
            t.start()