-
pexpect和非UTF-8编码的ssh
pexpect是一个用python实现的类似expect的库,支持ssh,ftp等协议的交互。 以前自己写了一篇使用expect+python拉取数据的文章,现在发现了pexpect,便想要完全用python来写。总觉得用expect生成中间文件不是很好。
-
使用expect+python拉取数据并生成报表
虽然脚本周一的时候就写好了,但是昨天才是第一次正式使用。加上昨天写了第二篇shell的tips,所以expect+python的脚本gen_report今天才写。 首先说一下背景。由于工作需要,有时我需要ssh到服务器上拉取运行数据生成报表。整个过程很枯燥,就是登录服务器,输入密码,运行二三十条很像的命令,把数据复制到microsoft excel或者libre office calc中计算。一言以蔽之:整个人肉操作。 很明显,如果让我天天干,我肯定不愿意。但是即使不是天天干,一周干一次,我也不愿意,因为命令执行很慢,来回弄肯定要半天。按照《时间管理 给系统管理员》,这种时候最适合写脚本了。 常规策略是在服务器上写好一个脚本,ssh上去执行一下,再使用scp把结果下载下来,最后使用比如python来解析生成csv等报表。但是,不行。首先遇到的问题就是服务器貌似不支持publickey,其次服务器上命令有限制(很常见,你不是管理员),不支持publickey的直接后果是ssh后执行命令和scp无法使用,只能另外寻找方法。 由于某些原因,我知道expect。虽然交互式的命令很好,但是如果你要让交互式的命令自动化的话,却很麻烦,比如ssh,ftp。这个时候expect可以帮助你解决问题。证明是网上搜索expect ssh login一抓一大把。所以我现在的考虑是通过expect代替ssh登录服务器执行命令。因为不能用scp,所以考虑把expect通过重定向或者tee放入某个文件中,最后让python解析这个日志文件即可。(最近重新看了点expect的书,貌似expect可以直接设置日志文件,不用tee之类的重定向,之后有空可以尝试下。) 基本策略确定了,方向基本也清楚了。由于涉及expect和python两种语言和程序,所以我选择shell做总控制的脚本。以下是总控制脚本即gen_report的内容(部分和工作相关的内容已经做了修改):