一、前言

在日常运维的过程中,经常需要登录主机去执行一些命令,有时候需要登录一批主机执行相同的命,手动登录执行的化效率太慢, 所以可以通过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#如果没了退出

最新文章

  1. Android的setVisibility(View.GONE)无效的问题及原因分析
  2. 原生cookie
  3. 开源PLM软件Aras详解五 如何让ItemType显示在TOC上
  4. html JS打印添加水印图片
  5. 解读oracle执行计划-待续
  6. 动态规划(斜率优化):[CEOI2004]锯木厂选址
  7. C++顺序性容器、关联性容器与容器适配器
  8. OCP读书笔记(4) - 配置备份设置
  9. hadoop2.5.2安装部署
  10. bootstrap-table 表格加载中....处理
  11. 笔记:MyBatis XML配置-Settings 完整属性表
  12. numpy 初识(三)
  13. 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
  14. 闲聊DNN CTR预估模型
  15. 51NOD 1087 1 10 100 1000
  16. MAPE 平均绝对百分误差
  17. 软工读书笔记 week 5 ——《构建之法》
  18. Filter 介绍
  19. TortoiseSVN 源代码下载
  20. learn go function callback

热门文章

  1. Shell脚本 一键重启
  2. Linux 报错:syntax error "C" 解决办法(此处选择bash系统)
  3. 基于HttpURLConnection的接口调用,支持GET&POST
  4. Redis入门(介绍、搭建)——Windows、Centos环境
  5. mysql必知必会--用正则表达式 进行搜索
  6. Linux学习Day4:管道符、重定向与环境变量
  7. Ubuntu安装C#语言开发环境
  8. 走进MEasy的世界:基于STM32MP1的IOT参考设计
  9. js Dom为页面中的元素绑定键盘或鼠标事件
  10. jQuery---事件解绑与事件触发