zoukankan      html  css  js  c++  java
  • 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
    '''
        #根据
    分割ip
        ip_list = ips.split("
    ")
        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"+"
    "
        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
    '''
        #根据
    分割ip
        ip_list = ips.split("
    ")
        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#如果没了退出
  • 相关阅读:
    FLASK报错,TypeError,需要valid response
    pycharm push failed
    pycharm环境艰难安装requirements.txt库文件
    git如何忽略部分不想备份的文件
    redis.exceptions.ConnectionError,目标计算机积极拒绝
    Mysql无法启动
    pymysql
    mysql数据类型
    MySQL命令(SQL语句)
    MySQL安装(windows10)
  • 原文地址:https://www.cnblogs.com/huguodong/p/12328965.html
Copyright © 2011-2022 走看看