一、前言

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

Python通过paramiko批量远程主机执行命令的更多相关文章

  1. python之实现批量远程执行命令(堡垒机)

    python远程批量执行 我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁. 前段时间一个同学找我一起做一个自动化运维平台,我对pytho ...

  2. 【python】用python脚本Paramiko实现远程执行命令、下载、推送/上传文件功能

    Paramiko: paramiko模块,基于SSH用于连接远程服务器并执行相关操作. SSHClient: 用于连接远程服务器并执行基本命令 SFTPClient: 用于连接远程服务器并执行上传下载 ...

  3. shell 批量远程主机执行命令

    [yunwei@Y24-209 ~]$cat ls.sh #!/bin/bash ip55=`cat ip1` for i in $ip55;do ping -c 1 $i if [ $? -eq 0 ...

  4. expect脚本同步文件 expect脚本指定host和要同步的文件 构建文件分发系统 批量远程执行命令

    自动同步文件 #!/usr/bin/expect set " spawn rsync -av root@.txt /tmp/ expect { "yes/no" { se ...

  5. expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统、批量远程执行命令

    7月20日任务 20.31 expect脚本同步文件20.32 expect脚本指定host和要同步的文件20.33 构建文件分发系统20.34 批量远程执行命令扩展:shell多线程 http:// ...

  6. Ansible批量在远程主机执行命令

    Ansible直接执行远程命令,不用ssh登陆交互执行. 如下: ansible all -i 192.168.199.180, -m shell -a "ifconfig" -u ...

  7. python实现批量远程执行命令及批量上传下载文件

    #!/usr/bin/env python # -*- coding: utf- -*- # @Time : // : # @Author : xuxuedong # @Site : # @File ...

  8. python通过getopt模块获取执行命令参数

    python脚本和shell脚本一样可以获取命令行的参数,根据不同的参数,执行不同的逻辑处理. 通常我们可以通过getopt模块获得不同的执行命令和参数. 下面我通过新建一个test.py的脚本解释下 ...

  9. ssh远程主机执行命令或脚本

    1.执行单一命令 [root@vps ~]# ssh user@192.168.9.243 "pwd; ls; rm -f Cent* ;echo --------; ls"/ho ...

随机推荐

  1. 浮动和包含框的关系,伪元素after解决高度塌陷

    浮动会使元素尽量向左或向右移动,直到碰到包含框或另外一个浮动元素的盒子模型的边缘 包含框并不会改变里面浮动元素的宽高,浮动元素宽高不会限制在包含块以内 <!DOCTYPE html> &l ...

  2. gcd综合

    问题: 如果正整数大于了1000有什么影响? 1.递推式gcd: int gcd(int a,int b) { ) { int c=a%b; a=b; b=c; } return a; } 2.递归式 ...

  3. .net 微服务实践

    l  前言 本文记录了我的一次.net core 微服务架构实践经验,以及所用到的技术 l  优点 每个服务聚焦于一块业务,无论在开发阶段或是部署阶段都是独立的,更适合被各个小团队开发维护,团队对服务 ...

  4. python+selenium自动化测试,浏览器最大化报错解决方法

    此处以谷歌浏览器为例 [问题1]缺少chrome驱动,webdriver调用谷歌浏览器的时候就报错了,如下图: [原因分析]缺少谷歌驱动程序 [解决办法] 1.查看本地安装chrome浏览器版本 2. ...

  5. MySQL基础(4) | 视图

    MySQL基础(4) | 视图 基本语法 1.创建 CREATE VIEW <视图名> AS <SELECT语句> 语法说明如下. <视图名>:指定视图的名称.该名 ...

  6. 微软帮助类SqlHelper

    using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...

  7. 使用node.js实现apache功能

    1.先实现在url中输入文件路径能展示对应文件内容功能 const http = require('http') const fs = require('fs') const server = htt ...

  8. php根据字段相识度进行排序查询

    $data = [ [ 'id'=>1, 'title'=>'test内容管理系统', ], [ 'id'=>2, 'title'=>'开源test', ], [ 'id'=& ...

  9. linux中 nodejs 安装 sqlite3 出现的问题

    错误代码类似:Error: Cannot find module '/root/QuickNote/node_modules/sqlite3/lib/binding/node-v57-linux-x6 ...

  10. 流程图GGEditor 之 自定义节点相关属性

    自定义节点 注册 -- registerNode 我们通过以下接口往 G6 全局注册节点: // 注册节点 G6.registerNode(name, { // 绘制 draw(item) {   r ...