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#如果没了退出
本文来自博客园,作者:HuTiger,转载请注明原文链接:https://www.cnblogs.com/huguodong/p/12328965.html,欢迎加入qq群927460240学习讨论