通过一个很坑的任务,最近认识了一个新坑: 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. Hibernate查询所有数据的操作

    Hibernate查询所有数据的操作方式有三种. 1.Query (1)使用该方法查询时,不需要编写sql语句,但是需要编写hql(Hibernate Query Language)语句,该语句是Hi ...

  2. Bash实践:抽样检测数据迁移至Redis集群后的数据一致性

    熟悉了一段时间的Bash编程,因此借此任务操作一把bash编程,主要涉及到Redis单节点与Redis集群的操作 1. 任务背景 近日有个任务需要将历史的Redis(主从节点)中的数据迁移至Redis ...

  3. c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果

    一.缩放要求 1.缩放对象在可视区域内,已对象的中心点进行缩放. 2.缩放对象比可视区大,并且对象各边界都在可视区外围,那么已鼠标位置进行缩放. 3.缩放对象比可视区大,但是缩放后某一边界在可视区的对 ...

  4. 跨域拦截Access-Control-Allow-Origin设置多个origin

    在Extjs和java项目碰到了需要同时处理跨域,外部要访问后台接口的问题 原来的代码是这样,只能设置一个extjs前台需要过滤的跨域请求 package com.xgt.config; import ...

  5. CentOS7配置中文

    CentOS7配置中文 yum install kde-l10n-Chinese -y vim /etc/locale.conf修改为zh_CN.UTF-8 vim /etc/environment添 ...

  6. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

  7. java泛型使用

    泛型的解释 现在感觉泛型是一个值得学习的地方,就抽出时间来学习和总结一下泛型的使用. Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允 ...

  8. 获取页面z-index最大值

    getMaxZIndex = function () { var maxZ = Math.max.apply(null, $.map($('body *'), function(e,n) { if ( ...

  9. MySQL--主从数据库同步原理

    主从数据库的复制原理:摘自MySQL官网 1. 异步 * 主在执行sql之后,记录二进制bin-log文件.   * 同时从连接主服务器,并从主获取binlog,存于本地relay-log,并从上次记 ...

  10. PeekMessage&GetMessage

    原文:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html PeekMessage与GetMessage的对比相同点:PeekM ...