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#如果没了退出

 

posted @ 2020-02-18 22:09  HuTiger  阅读(1983)  评论(0编辑  收藏  举报