弃坑pexpect,入坑paramiko
上文书说到,ssh库pexpect的使用,简直就是个“月亮公主”——满眼全是坑。勉强把程序写好了,跑起来的时候发现了一个新坑,让我不可抗拒的把它弃掉了——经常莫名其妙的连不上服务器!开线程连接14台服务器,总有1到3台连不上,还查不到原因。这还了得!一怒之下把写好的pexpect封装库删掉了,用paramiko重新写起。其实这个库也是有一些坑的,这个放在后面说。先介绍一下这个库的用法。
安装方法:没有什么新鲜的
pip install paramiko
或者下载源码编译。需要事先安装一下PyCrypto库,同样可以pip安装。
使用方法:
import paramiko
之后,首先可以先建立一个全局的log(非必需)
paramiko.util.log_to_file('paramiko.log')
创建一个实例
s = paramiko.SSHClient()
设置一个balabala(好吧我解释不清这是什么,密钥之类的东西)
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
然后连接
s.connect(hostname=hostname, username=username, password=password)
注意连接方法并没有返回值。
接下来发送一条命令
stdin, stdout, stderr = s.exec_command('ls -l')
paramiko所使用的shell是bash,即使在Ubuntu里面也没有ll这个命令,只能用ls -l。
然后这里就有趣了。这里返回了三个流:stdin(标准输入)、stdout(标准输出)和strerr(标准错误),流是不可以直接读的,得像打开一个文件那样读取,用read()或readlines()。并且,这两个函数都是一次性的,也就是说,read()一次,再次read()时候结果为None,因此,需要有缓存来接住这个流:
sin, sout, serr = stdin.readlines(), stdout.readlines(), stderr.readlines()
read和readline的区别跟读文件一样,read是把所有值读进一个字符串,自己处理;readlines是得到一个列表,按行分隔,可直接for i in out.readlines()也可以自己处理列表内容。
一般的情况,发送命令的返回结果都在out中,有这么几种特殊情况:
1、执行错误。这时候out是一个空列表,而错误写在了err中。
2、执行正确,但是本来命令就没有什么返回值。这时候out和err都为空。
3、执行正确,但是由于某些特殊坑命令,返回值是在err中给出,out为空。
初次发现这个问题的时候我整个人是懵逼的,大概是这么个表情:

卧槽这特么要怎么判断执行结果?后来想了些办法,迂回来看了。比如wget就是这样。解决方案是在命令结束后再发送一个ls命令,查看一下现在文件是否存在。
4、sudo命令。这特么就是个万年大坑,不管是pexpect还是paramiko,我都栽在sudo上面好久。血泪史我就不说了,直接说解决方法吧:
首先,sudo后面要加一个-S选项,表示从标准输入接收密码。标准输入?咋么听起来那么耳熟?没错,就是stdin,发送完命令之后要再发个密码;然后,命令的最后要加上’\n’作为命令的结束,如果没有加,那么恭喜你,服务器以为你没有结束命令,还在等待,而你不知道服务器的状态,在等待它给你反馈。于是
“我的心,在等待,永远在等待哎哎~~”
“你知不知道,你知不知道,我等到花儿也谢了嗷嗷~~”
“等下一个天亮,去上次牵手赏花那里散步好吗~”
。。。。。。
咳咳,回来。总的来说sudo就是这样的:
stdin, stdout, stderr = s.exec_command(‘sudo -S %s\n’ % cmd)
stdin.write(‘%s\n’ % password)
stdin.flush()
out = stdout.readlines()
这样就可以了。
最后的最后,别忘了退出
s.close()
我使用的就是这么多了。其他的有send和recv函数,可以跟pexpect一样发送命令,接收命令;有RSA等加密方法;还有很多方便的函数。平胸而论,不对,平心而论,这个库应该是蛮不错的,可以做一个交互式的ssh shell,而且据说windows下也可以用,比pexpect不知道高到哪里去了。只是我时间太仓促,晚上加班几个小时内学一个新库,又把200多行代码完全推倒重写,任谁都会有点怨言是吧。以后如果需要的话(学乖了,不说有时间的话)还可以继续深入研究一下。
这次就先到这里了。
弃坑pexpect,入坑paramiko的更多相关文章
- 入坑wsl
用了一个月的mac os, 又回归windows了, mac确实好看, 终端配合iterm2也很舒服, 奈何终究我们不合适...生态毕竟没有windows那么丰富; 切回windows最无法忍受的就是 ...
- 写个 Hello world - 前端从入坑到弃坑系列教程(1)
这是一个系列教程<前端从入坑到弃坑>的第一篇. HTML 是什么 说白了,HTML 就是网页的内容.比如你现在正在阅读的这个网页的内容,就是 HTML.如果你还不明白,请继续往下阅读. 写 ...
- 初生牛犊不怕虎 golang入坑系列
读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...
- Angular 从入坑到挖坑 - Angular 使用入门
一.Overview angular 入坑记录的笔记第一篇,完成开发环境的搭建,以及如何通过 angular cli 来创建第一个 angular 应用.入坑一个多星期,通过学习官方文档以及手摸手的按 ...
- Angular 从入坑到挖坑 - 组件食用指南
一.Overview angular 入坑记录的笔记第二篇,介绍组件中的相关概念,以及如何在 angular 中通过使用组件来完成系统功能的实现 对应官方文档地址: 显示数据 模板语法 用户输入 组件 ...
- Angular 从入坑到挖坑 - 表单控件概览
一.Overview angular 入坑记录的笔记第三篇,介绍 angular 中表单控件的相关概念,了解如何在 angular 中创建一个表单,以及如何针对表单控件进行数据校验. 对应官方文档地址 ...
- Angular 从入坑到挖坑 - HTTP 请求概览
一.Overview angular 入坑记录的笔记第四篇,介绍在 angular 中如何通过 HttpClient 类发起 http 请求,从而完成与后端的数据交互. 对应官方文档地址: Angul ...
- [Abp vNext 入坑分享] - 前言
一·背景 Abp vnext是 ABP 框架作者所发起一个完全基于 ASP .NET Core框架,截至2020年4月份已经升级到2.5.0版本,根据经验2.0版本以后可以放心的使用在生产环境.类似a ...
- Angular 从入坑到挖坑 - Router 路由使用入门指北
一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...
- Angular 从入坑到挖坑 - 路由守卫连连看
一.Overview Angular 入坑记录的笔记第六篇,介绍 Angular 路由模块中关于路由守卫的相关知识点,了解常用到的路由守卫接口,知道如何通过实现路由守卫接口来实现特定的功能需求,以及实 ...
随机推荐
- Java入门系列-24-实现网络通信
互联网上那么多设备,java 是如何与其他设备通信的呢?这次的内容是网络通信的基础,有了它咱们才能上网页.玩游戏.视频聊天. Socket 客户端套接字 Socket 客户端套接字,用于连接互联网提供 ...
- 深入理解JavaScript系列(44):设计模式之桥接模式
介绍 桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化. 正文 桥接模式最常用在事件监控上,先看一段代码: addEvent(element, 'click', getBe ...
- Firebird DatabaseAccess WireCrypt DB2Provider
目前最新的Firebird版本是:3.0.3 使用过程的一些必经问题,嵌入式的模式就不再说了. 在使用标准Server版时,第一个要考虑的就是数据库文件的存放位置,默认配置放在windows/syst ...
- 微信小程序wx:for循环
最近做微信小程序碰到了一些问题,和wx:for循环相关,wx:for有很多用途,例如可以用于swiper中图片的循环,也就是所谓的轮播图,也可以用于其它的循环,可以大大地减少代码量. 但wx:for. ...
- jmeter单一接口测试
在使用jmeter进行单一接口测试之前,我们先来了解一下一个用户请求的过程,如下: 1)用户通过浏览器发起一个请求: 2)用户收到服务器返回的响应数据. 如上,就是一个WEB的请求/响应模型 jmet ...
- Java API 之 Annotation功能
JDK1.5开始增加了Annotation功能,该功能可用于: 1.类: 2.构造方法: 3.成员变量: 4.方法 5.参数 等的声明: 该功能并不影响程序的运行,但是会对编译器警告等辅助工具产生影响 ...
- 新手学习Java,该从哪里学起?
最近在入坑Java,Java基础知识了解的差不多了,听过很多人的建议,但是从别人那里听到的都是一些比较琐碎的东西,根据打听来的,结合网上自己找到的建议,开始详细地记录一下初学Java,应该掌握哪些具体 ...
- Linux 创建python虚拟环境
使用virtualenv包管理工具来管理虚拟环境 1.安装virtualenv 不知啥原因,第一次安装超时失败,第二次下载到30%超时失败,第三次才安装成功 2.创建虚拟环境 只有python2.7及 ...
- Codeforces Round #415 (Div. 2) C. Do you want a date?
C. Do you want a date? 2 seconds 256 megabytes Leha decided to move to a quiet town Vičkopolis, ...
- 【Udacity笔记】What is Machine Learning?
Teaching computers to learn to perform tasks from past experiences(recorded data) 一.Decision Tree(决策 ...