通过一个很坑的任务,最近认识了一个新坑: 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写的,传送门:
码了以后看(又码又码,博主你啥时候看过?)。有需要的自行翻看。或者去看一看这个库的源码。有些地方写了例子如何使用,不是很难,就是有一些涉及到操作系统底层和SSH相关协议的地方,没接触过表示看不懂。
 

pexpect 初坑的更多相关文章

  1. 【Xbox one S】开箱&开机&初入坑心得

    再来一发水贴,先上产品标准照镇贴: 前言 身为一个资深单机游戏玩家,常年混迹在PC平台,但内心深处一直对主机有种迷之向往,感觉那才是单机游戏的正处之地,坐沙发上拿着手柄对着电视跌宕起伏才是正确的游戏姿 ...

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

    我是一个在校实习生,作为一个程序猿,是个菜鸟中战斗机!对于测试,只写过一点点简单到不能再简单了的 Junit 单元测试的例子(因为当时这足以应付学校课程的内容与要求).这几天在公司里要真枪实弹做测试的 ...

  3. 弃坑pexpect,入坑paramiko

    上文书说到,ssh库pexpect的使用,简直就是个“月亮公主”——满眼全是坑.勉强把程序写好了,跑起来的时候发现了一个新坑,让我不可抗拒的把它弃掉了——经常莫名其妙的连不上服务器!开线程连接14台服 ...

  4. 老司机实战Windows Server Docker:1 初体验之各种填坑

    前言 Windows Server 2016正式版发布已经有近半年时间了,除了看到携程的同学分享了一些Windows Server Docker的实践经验,网上比较深入的资料,不管是中文或英文的,都还 ...

  5. IDEA+Maven配置MyBatis的初体验(坑点总结)

    起因 在老师的推荐下,我跟着这篇文章https://www.jb51.net/article/70923.htm尝试MyBatis的初次调试运行.途中困难重重,由于教程中的开发环境是eclipse,项 ...

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

    今天,2017年1月9日凌晨,微信小程序如约上线.2007年1月9日,整整10年前的今天,苹果的iPhone手机正式问世! 经不起新技术的诱惑了,想试着开发一下看看.刚开始遇到很多坑,在这里记录一下, ...

  7. 初入Java坑,然后又入产品坑

    之前工作了一年,从事Java相关工作,不小心深得领导器重,跑去演讲.写文档.与客户沟通等,最后应公司需要,转往产品坑,坑坑相连,何时逃坑. 最近一直在学习产品经理必备工具Axure,发现这真是一个神奇 ...

  8. 初写Linux脚本坑记录

    1.为变量赋值时=前后一定没有空格. 2.赋值时变量为xx,读取才是$xx.如赋值是$xx,则报语法错误.参考 http://www.jb51.net/article/52375.htm 3.脚本每句 ...

  9. scrapy初体验 - 安装遇到的坑及第一个范例

    scrapy,python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.scrapy的安装稍 ...

随机推荐

  1. FileReader实现上传图片前本地预览

    平时做图片上传预览时如果没有特殊的要求就直接先把图片传到后台去,成功之后拿到URL再渲染到页面上.或者使用前端插件.这篇博客使用的是HTML5的新特性——FileReader.由于兼容性,这种方法不适 ...

  2. 常用工具说明--Maven使用说明

    什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包.一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综 ...

  3. [转]Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)

    本文转自:http://www.cnblogs.com/aehyok/p/3545824.html 前言 很久没更新博客了,加上刚过年,现在准备重新开战,继续自己的学习之路.本文已同步到Web API ...

  4. c# winfrom 页面的enter变为tab 功能使用 在特定的按钮里面如何继续当enter使用求大神帮忙解答一下 !!急

    enter 当tab  键用 已经实现  :例如按回车的时候切换一直走 ,走到一个按钮如何让回车键在这个按钮的时候还是执行enter按钮的功能而不是tab   求大神解答一下, 目前页面tab功能改为 ...

  5. js校验数字是否为小数

    js校验数字是否为小数: function checkDot(c) {c = parseFloat(c); -]?[-]*\.[-]*[-]+$/; return r.test(c); }

  6. 八、cent OS下tomcat启用APR并发模式

    Tomcat支持三种接收请求的处理方式: BIO.NIO.APR ,本文记录tomcat配置APR模式,也是首选的模式.(Tomcat7 或以下,在 Linux 系统中默认使用BIO方式) 安装依赖库 ...

  7. Filter的常见应用

    1.字符编码过滤器 实现功能,在a.jsp中填写用户名提交到b.jsp,在b.jsp中读取参数名. a.jsp <body> <form action="encoding/ ...

  8. 工厂模式的C++、Java实现

    1.工厂模式UML 图1. 工厂模式UML 2.C++实现 类视图如下: 图2. 工厂模式C++实现的类图 其中,Factory实现为: //工厂类. class Factory { public: ...

  9. Java多线程系列--CopyOnWriteArraySet

    转载:http://www.cnblogs.com/skywang12345/p/3498497.html 概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyO ...

  10. csharp: datagridview Convert csv file

    /// <summary> /// 保存文件 /// 涂聚文 /// 2014-08-29 /// Geovin Du /// </summary> /// <param ...