Python通過paramiko批量遠程主機執行命令


一、前言

  在日常運維的過程中,經常需要登錄主機去執行一些命令,有時候需要登錄一批主機執行相同的命,手動登錄執行的化效率太慢, 所以可以通過Python的paramiko模塊批量執行,本篇文章基於python2.7。

二、同步執行

根據ip列表按順序執行,缺點是如果命令耗時長,主機很多的話,執行效率較慢

 

# -*- encoding: utf-8 -*-
import paramiko
import traceback

def ssh(sys_ip, username, password, cmds):
    try:
        # 創建ssh客戶端
        client = paramiko.SSHClient()
        # 第一次ssh遠程時會提示輸入yes或者no
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 密碼方式遠程連接
        client.connect(sys_ip, 22, username=username, password=password, timeout=5)

        # 互信方式遠程連接
        # key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa")
        # ssh.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20)
        # 執行命令
        stdin, stdout, stderr = client.exec_command(cmds)
        # 獲取命令執行結果,返回的數據是一個list
        result = stdout.readlines()
        if len(result)>0:
            return sys_ip + ":" + str(result[0])
        else:
            return sys_ip + ":" + "none"
    except Exception, e:
        print sys_ip+" error:"+str(e)
        print traceback.format_exc()
    finally:
        client.close()


if __name__ == "__main__":
    ips='''10.198.1.1
10.198.1.2
10.198.1.3
10.198.1.4
10.198.1.5
10.198.1.6
10.198.1.7
10.198.1.8
10.198.1.9
'''
    #根據\n分割ip
    ip_list = ips.split("\n")
    username = "test"#主機用戶名
    password = "test"#主機密碼
    cmds = "pwd"#需要執行的命令
    for ip in ip_list:
        ssh(ip, username, password, cmds)

二、異步執行

同步執行如果機器太多耗時長,效率就比較低,就可以使用異步方法同時執行,缺點是如果同時執行太多程序會有問題,所以加了sleep。

# -*- encoding: utf-8 -*-
import time

import paramiko
import traceback
from threading import Thread

def async(f):
    def wrapper(*args, **kwargs):
        thr = Thread(target=f, args=args, kwargs=kwargs)
        thr.start()
    return wrapper

@async
def ssh(sys_ip, username, password, cmds):
    try:
        # 創建ssh客戶端
        client = paramiko.SSHClient()
        # 第一次ssh遠程時會提示輸入yes或者no
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 密碼方式遠程連接
        client.connect(sys_ip, 22, username=username, password=password, timeout=5)
        # 互信方式遠程連接
        # key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa")
        # ssh.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20)
        # 執行命令
        stdin, stdout, stderr = client.exec_command(cmds,timeout=30)
        # 獲取命令執行結果,返回的數據是一個list
        result = stdout.readlines()
        if len(result)>0:
            print sys_ip + ":" + str(result[0])
        else:
            print sys_ip + ":" + "none"+"\n"
    except Exception, e:
        print sys_ip+" error:"+str(e)+"\n"
        print traceback.format_exc()
    finally:
        client.close()



if __name__ == "__main__":
    ips='''10.198.1.1
10.198.1.2
10.198.1.3
10.198.1.4
10.198.1.5
10.198.1.6
10.198.1.7
10.198.1.8
10.198.1.9
'''
    #根據\n分割ip
    ip_list = ips.split("\n")
    username = "test"#主機用戶名
    password = "test"#主機密碼
    cmds = "pwd"#需要執行的命令
    while (True):
        ipl = ip_list[0:5]#每次拿五個
        for ip in ipl:
            ssh(ip, username, password, cmds)
        time.sleep(3)
        del ip_list[0:5]#刪除5個
        if len(ip_list) == 0: break#如果沒了退出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM