Python通过paramiko批量远程主机执行命令
2024-08-25 04:18:24
一、前言
在日常运维的过程中,经常需要登录主机去执行一些命令,有时候需要登录一批主机执行相同的命,手动登录执行的化效率太慢, 所以可以通过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#如果没了退出
最新文章
- Android的setVisibility(View.GONE)无效的问题及原因分析
- 原生cookie
- 开源PLM软件Aras详解五 如何让ItemType显示在TOC上
- html JS打印添加水印图片
- 解读oracle执行计划-待续
- 动态规划(斜率优化):[CEOI2004]锯木厂选址
- C++顺序性容器、关联性容器与容器适配器
- OCP读书笔记(4) - 配置备份设置
- hadoop2.5.2安装部署
- bootstrap-table 表格加载中....处理
- 笔记:MyBatis XML配置-Settings 完整属性表
- numpy 初识(三)
- 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
- 闲聊DNN CTR预估模型
- 51NOD 1087 1 10 100 1000
- MAPE 平均绝对百分误差
- 软工读书笔记 week 5 ——《构建之法》
- Filter 介绍
- TortoiseSVN 源代码下载
- learn go function callback
热门文章
- Shell脚本 一键重启
- Linux 报错:syntax error ";C"; 解决办法(此处选择bash系统)
- 基于HttpURLConnection的接口调用,支持GET&;POST
- Redis入门(介绍、搭建)——Windows、Centos环境
- mysql必知必会--用正则表达式 进行搜索
- Linux学习Day4:管道符、重定向与环境变量
- Ubuntu安装C#语言开发环境
- 走进MEasy的世界:基于STM32MP1的IOT参考设计
- js Dom为页面中的元素绑定键盘或鼠标事件
- jQuery---事件解绑与事件触发