ssh批量登录并执行命令的python实现代码


Posted in Python onMay 25, 2012

局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的。现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件,拷贝某些文件,批量关机等。如果一台一台得手工去操作,费时又费力,如果要进行多个操作就更麻烦啦。
或许你会想到网络同传, 网络同传是什么?就是在一台电脑上把电脑装好,配置好,然后利用某些软件,如“联想网络同传”把系统原样拷贝过去,在装系统时很有用,只要在一台电脑上装好,同传以后所有的电脑都装好操作系统了,很方便。同传要求所有电脑硬件完全相同,在联想的电脑上装的系统传到方正电脑上肯定会出问题的。传系统也是很费时间的,根据硬盘大小,如果30G硬盘,100多台电脑大约要传2个多小时,反正比一台一台地安装快!但是如果系统都传完了,发现忘了装一个软件,或者还需要做些小修改,再同传一次可以,但是太慢,传两次半天时间就没了。这时候我们可以利用ssh去控制每台电脑去执行某些命令。
先让我们回忆一下ssh远程登录的过程:首先执行命令 ssh username@192.168.1.x ,第一次登录的时候系统会提示我们是否要继续连接,我们要输入“yes”,然后等一段时间后系统提示我们输入密码,正确地输入密码之后我们就能登录到远程计算机,然后我们就能执行命令了。我们注意到这里面有两次人机交互,一次是输入‘yes',另一次是输入密码。就是因为有两次交互我们不能简单的用某些命令去完成我们的任务。我们可以考虑把人机交互变成自动交互,python的pexpect模块可以帮我们实现自动交互。下面这段代码是用pexpect实现自动交互登录并执行命令的函数:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import pexpect 
def ssh_cmd(ip, passwd, cmd): 
ret = -1 
ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd)) 
try: 
i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5) 
if i == 0 : 
ssh.sendline(passwd) 
elif i == 1: 
ssh.sendline('yes\n') 
ssh.expect('password: ') 
ssh.sendline(passwd) 
ssh.sendline(cmd) 
r = ssh.read() 
print r 
ret = 0 
except pexpect.EOF: 
print "EOF" 
ssh.close() 
ret = -1 
except pexpect.TIMEOUT: 
print "TIMEOUT" 
ssh.close() 
ret = -2 
return ret

利用pexpect模块我们可以做很多事情,由于他提供了自动交互功能,因此我们可以实现ftp,telnet,ssh,scp等的自动登录,还是比较实用的。根据上面的代码相信读者已经知道怎么实现了(python就是那么简单!)。
用上面的代码去完成任务还是比较费时间的,因为程序要等待自动交互出现,另外ubuntu用ssh连接就是比较慢,要进行一系列的验证,这样才体现出ssh的安全。我们要提高效率,在最短的时间内完成。后来我发现了python里面的paramiko模块,用这个实现ssh登录更加简单。看下面的代码:
#-*- coding: utf-8 -*- 
#!/usr/bin/python 
import paramiko 
import threading 
def ssh2(ip,username,passwd,cmd): 
try: 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(ip,22,username,passwd,timeout=5) 
for m in cmd: 
stdin, stdout, stderr = ssh.exec_command(m) 
# stdin.write("Y") #简单交互,输入 ‘Y' 
out = stdout.readlines() 
#屏幕输出 
for o in out: 
print o, 
print '%s\tOK\n'%(ip) 
ssh.close() 
except : 
print '%s\tError\n'%(ip) 
if __name__=='__main__': 
cmd = ['cal','echo hello!']#你要执行的命令列表 
username = "" #用户名 
passwd = "" #密码 
threads = [] #多线程 
print "Begin......" 
for i in range(1,254): 
ip = '192.168.1.'+str(i) 
a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd)) 
a.start()

上面的程序还是有些技巧的:
1.利用多线程,同时发出登录请求,同时去连接电脑,这样速度快很多,我试了一下,如果不用多线程,直接一个一个挨着执行的话,大约5~10秒钟才能对一台电脑操作完,具体时间要根据命令的来决定,如果是软件安装或者卸载时间要更长一些。这样下来怎么也要一二十分钟,用多线程后就快多了,所有的命令执行完用了不到2分钟!
2.最好用root用户登录,因为安装或者卸载软件的时候如果用普通用户又会提示输入密码,这样又多了一次交互,处理起来就比较麻烦!安装软件时apt-get install xxx 最好加上“-y”参数,因为有时安装或删除软件时提示是否继续安装或卸载,这又是一次自动交互!加上那个参数后就没有人机交互了。
3. 循环时循环所有ip,因为计算机的ip是路由器自动分配的,保险起见,最好全部都执行,保证没有遗漏的主机
4.远端执行命令时如果有交互,可以这样用 stdin.write("Y")来完成交互,“Y”就是输入“Y”。
5.把所有的命令放到一个列表里面,遍历列表可以依次执行列表里面的命令
6.为了更好的进行控制,最好在电脑上提前把root用户打开,装好ssh服务器并让其开机自动执行。

作者:cnblogs ma6174

Python 相关文章推荐
Python中%r和%s的详解及区别
Mar 16 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
Python unittest基本使用方法代码实例
Jun 29 Python
浅谈Python中的正则表达式
Jun 28 Python
python3 字符串str和bytes相互转换
Mar 23 Python
Python闭包的定义和使用方法
Apr 11 Python
巧用Python装饰器 免去调用父类构造函数的麻烦
May 18 #Python
Python使用Socket(Https)Post登录百度的实现代码
May 18 #Python
写了个监控nginx进程的Python脚本
May 10 #Python
400多行Python代码实现了一个FTP服务器
May 10 #Python
使用PYTHON接收多播数据的代码
Mar 01 #Python
使用PYTHON创建XML文档
Mar 01 #Python
基于python的汉字转GBK码实现代码
Feb 19 #Python
You might like
PHP查询网站的PR值
2013/10/30 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
JavaScript中操作字符串小结
2015/05/04 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
python实现12306火车票查询器
2017/04/20 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
django 类视图的使用方法详解
2019/07/24 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
vue路由实现登录拦截
2021/03/24 Vue.js
营销总经理的岗位职责
2013/12/15 职场文书
业务内勤岗位职责
2015/04/13 职场文书
物业公司管理制度
2015/08/05 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
在 Python 中利用 Pool 进行多线程
2022/04/24 Python