pexpect 初坑

通过一个很坑的任务,最近认识了一个新坑: pexpect 。其实基本的用法并不难,不过,我还是跟以前一样,把几个基本函数的坑蹚了个遍。有感而发,记录一下。

首先简单的介绍一下这个坑,哦不对,这个库。这是一个 linux 下做SSH 远程登录和操作的库。我们平时用 windows 连接linux 的话,一定很熟悉 SecureCRT ,putty 这样的工具,这些工具就是通过 SSH 做远程连接的。pexpect正是这样一个库,如果有兴趣的话,使用这个库就可以做出一个 SSH 连接的工具。

然后介绍一下这个库的基本使用方法:

通过 pip install pexpect 可以方便的安装上这个库,然后,在代码中引入包:

from pexpect import pxssh

使用时先建立一个对象

ssh = pxssh.pxssh()

然后登录到远程的 linux 机器上

ssh.login(server, username, password, port, login_timeout)

接下来是程咬金的三板斧

# 向 linux发送命令,返回一个长度(源码中写了这个长度是什么,不过我没太看懂)
ssh.sendline(cmd)
# 接收返回的命令(接收成功即为 True ,不管命令执行结果是什么)
ssh.prompt()
# 接收到的返回值的内容
ret = ssh.before 

这个时候只要

print ret

就可以看到结果了。

最后别忘了

ssh.logout()

退出。

常用的方法就这些,有一些比较高级的用法我还没有玩,我的任务对这个库的使用就仅限于此了。辣么问题来了,博主484sa,这都玩不明白?

呵呵。

下面讲讲坑吧。

坑一,只能在 linux或unix下使用。

这是由于这个模块使用了一个叫pty的东西,这个是POSIX标准,windows里面并没有。第一次用的时候,在windows下面调了一阵子,又百度了一阵子才知道。浪费时间。

坑二,一个对象只能登录一次。

不管有没有退出,再次 login 都会出错。再次登录只会报错:AssertionError: The pid member must be None. 从这个错误字面上看起来是可以解决的,然而不知道何解。要想再登录只能新建一个对象。

坑三,prompt() 如果不设置timeout,就基本只会返回 True,或者傻等着。

它不抛异常啊!不timeout不返回False啊!就一个黑洞洞的窗口里面一个光标孤独寂寞的闪啊!

坑四,sudo 的处理相当不善良。

我们知道一个“正常”的shell里面sudo一条命令,之后是要输入密码的。然而pexpect不会自动识别。sendline(sudo xxx)之后,再prompt()就会出现上一条的情况:没有然后了!处理方法就是:给prompt设置一个timeout,等待返回,如果返回False,就再sendline一下,把密码发送过去。接下来就正常了,ssh.prompt()接收结果,print ssh.before看结果。注意,这里第一行显示的不是刚才那条命令,而是 [sudo] password for xxx:

坑五,  ssh.before 返回的第一行是原命令。并且是有缓冲区的。

很诡异的每 70 字节后面加上一个 \r。 print 的时候就会看到命令循环从这一行开头开始覆盖。解决方法就是把\r给replace掉。

坑六, 不容易看出命令是否执行成功,只能通过 ssh.before 的内容来判断。

某次执行命令,无论如何都看不出来结果,调试了N长时间,最后发现在登录时候就已经超时,未登录成功,导致后面的发送命令都没有进行。

唉。本来我写的那个脚本里面业务逻辑就复杂,然后这个库也跟着捣乱,导致写起来各种吐血。现在终于把脚本写完了,把这个库的初步使用方法记录一下。详细使用方法有两篇IBM写的,传送门:

https://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/

https://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2/

码了以后看(又码又码,博主你啥时候看过?)。有需要的自行翻看。或者去看一看这个库的源码。有些地方写了例子如何使用,不是很难,就是有一些涉及到操作系统底层和SSH相关协议的地方,没接触过表示看不懂。

*************************懒得想这是什么分隔线了*************************

请允许我再次给我的群做个广告:鱼香肉丝—IT技术联盟(234509621),开发测试运维样样都有,JavaPythonPHP种种全能。入群时说明一下是做什么的,会有管理员给通过。

什么?不允许做广告?好吧,反正我已经说完了,你来打我呀!

时间: 2024-08-24 08:31:45

pexpect 初坑的相关文章

弃坑pexpect,入坑paramiko

弃坑pexpect,入坑paramiko 上文书说到,ssh库pexpect的使用,简直就是个"月亮公主"--满眼全是坑.勉强把程序写好了,跑起来的时候发现了一个新坑,让我不可抗拒的把它弃掉了--经常莫名其妙的连不上服务器!开线程连接14台服务器,总有1到3台连不上,还查不到原因.这还了得!一怒之下把写好的pexpect封装库删掉了,用paramiko重新写起.其实这个库也是有一些坑的,这个放在后面说.先介绍一下这个库的用法. 安装方法:没有什么新鲜的 pip install para

初用react容易踩的坑

此文章同步连接: https://github.com/p2227/p2227.github.io/issues/3 # 初用react容易踩的坑 ## 自定义组件忘记大写第一个字母 ```javascript var myComp = React.createClass({ render: function() { return <div>Hello world</div>; } }); ReactDOM.render(<myComp />, mountNode);

【Xbox one S】开箱&amp;开机&amp;初入坑心得

再来一发水贴,先上产品标准照镇贴: 前言 身为一个资深单机游戏玩家,常年混迹在PC平台,但内心深处一直对主机有种迷之向往,感觉那才是单机游戏的正处之地,坐沙发上拿着手柄对着电视跌宕起伏才是正确的游戏姿势.80后的机友大概都有小时候跟小伙伴坐地上双打小霸王的愉快记忆,儿时的记忆总是那么深刻,任凭岁月和社会如何磨灭,总有些感觉想要找回,所以很难说现在淘来一台游戏机有几分是为了当下的娱乐,几分是为了找到当年的感觉.当然了,今天的PC也完全可以让你坐沙发拿手柄看电视甚至玩着相同的游戏,但就凭它叫游戏机,

说说初用 Mock 工具测试碰到的坑

我是一个在校实习生,作为一个程序猿,是个菜鸟中战斗机!对于测试,只写过一点点简单到不能再简单了的 Junit 单元测试的例子(因为当时这足以应付学校课程的内容与要求).这几天在公司里要真枪实弹做测试的时候,就深深体会到了"书到用时方恨少"这句话的真谛了.没办法,谁叫我当初不多深入的学点呢.于是,在杜叔杜大神的指导下,开始了菜鸟的初用 Mock 工具,边学边用的爬坑之旅. 为什么要用 Mock 工具? 话不多说,我们先直接看看个最简单的例子:测试目标: public class ToBe

DL踩坑:初尝过拟合

初尝过拟合 猫狗大战数据集 这是kaggle上一个非常经典的二分类图像数据集,训练集包括25000张猫和狗的图片及其标签,测试集则是12500张未标签图片,数据下载地址https://www.kaggle.com/c/dogs-vs-cats/data.不过这个网址比较远古,无法提交自己训练的答案,可以到新的(虽然也不新了)比赛链接提交https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview 将训练数据按类别分开整理

微信小程序初体验遇到的坑

今天,2017年1月9日凌晨,微信小程序如约上线.2007年1月9日,整整10年前的今天,苹果的iPhone手机正式问世! 经不起新技术的诱惑了,想试着开发一下看看.刚开始遇到很多坑,在这里记录一下,有遇到同样坑的可以参考 1.我用的是mac版本的开发工具,运行官方demo后报错 Failed to load resource: net::ERR_NAME_NOT_RESOLVEDhttp://1351598279.appservice.open.weixin.qq.com/appservice

【算法】初入坑—配置algs4.rar

搞不懂,明明国外的教材可以写得很深入浅出,比如带我入门的<Head First Java>和这本 <算法>(第4版),却偏偏不肯在环境配置那里写得清楚一样,像<笨方法学Python>里面对有 关powershell配置Python环境变量和一些常用指令的介绍就非常亲民,还有另一想Java入门教 材<Java语言程序设计>里面对Eclipse如何新建工程和类的介绍,才是真正考虑到了什么都不 懂的初学者的感受. 吐槽完以后,开始填坑,首先讲下Eclipse里面如

backbone.js初体验--构建简单分页应用时踩到的坑

最近突然想接触下之前没有接触过的领域,单页应用,正巧之前也是刚刚学习了requirejs的用法,所以趁热打铁选择了很多网站采用的requirejs+underscorejs+backbonejs+jquery(zepto)的方式来进行demo的编写. 这篇文章主要不是介绍怎么去构建一个分页效果的,也不会去讲述backbone的基础知识,而是分享在我构建分页效果时候踩到的一些坑. 1. collection不是必须的 首先,我在开始写的时候就陷入了一个问题,事实证明我真的是多虑了,就是不该用col

nodeJS初体验遇到的坑

由于新公司需要用到nodeJS,就去学了一下.自己先看了一下nodejs百度百科,大致知道它是在服务器端执行的js环境.下面是遇到的坑截图: 第一个坑是安装完nodejs后,path的环境变量会自动配置,我去path路径看了一下,发现路径确实自动添加进去了.所以我就直接在命令窗口执行,结果"不是内部或外部命令".我还以为因为nodejs默认安装在C:\Program Files目录,文件夹有空格的原因,所以把nodejs卸载然后安装在D盘,发现path路径已配置在新的安装目录,但是还是