通过一个很坑的任务,最近认识了一个新坑: 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. React.js 小书 Lesson23 - dangerouslySetHTML 和 style 属性

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson23 转载请注明出处,保留原文链接和作者信息. 这一节我们来补充两个之前没有提到的属性,但是在 ...

  2. 周记3——解决fixed属性在ios软键盘弹出后失效的bug

    这周在做空间(“类似”qq空间)项目.首页是好友发表的说说,可以针对每条说说进行评论,评论框吸附固定在屏幕底部.此时,Bug来了...在ios上,软键盘弹出后fixed属性失效了.后来发现,ios绝大 ...

  3. 深入理解JavaScript系列(46):代码复用模式(推荐篇)

    介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...

  4. visual studio 安装与sqlserver 安装

    先sqlserver再visual studio ,避免安装目录重复(sqlserver 中包含一部分visual  而  visual studio 中也包含有部分sqlserver内容) 安装vi ...

  5. Golang 的 TOML库

    TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...

  6. ES6的新知识点

    一.变量 原有变量: var的缺点: 1.可以重复声明 2.无法限制修改 3.没有块级作用域 新增变量: let :不能重复声明,变量-可以修改,块级作用域 const:不能重复声明,变量-不可以修改 ...

  7. 在HTML代码中使用freemarker

    在HTML代码中使用freemarker 1.freemarker中显示某对象的属性使用${user.name}. 但如果name为null,freemarker就会报错.如果需要判断对象是否为空: ...

  8. python垃圾回收机制(Garbage collection)

    由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...

  9. javastscript获取光标位置

    需求是获取某元素的内容,然后将该内容插入到文本框当前的光标位置 (function($) { $.fn.extend({ insertAtCaret: function(myValue) { var ...

  10. Python-网络编程(三)

    今天是网络编程的最后一天,明天会开始并发编程 socketserver模块实现并发 为什么要讲socketserver?我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用soc ...