醉里乾坤大,壶中日月长

python paramiko-SSH

上一篇 / 下一篇  2009-07-05 14:54:56

之前写了个通过Plink验证linux后台进程的脚本,可以满足在QTP对设备重启后进程情况的简单验证。领导鉴于此,对我说:眼看新员工就来了,公司规定新员工是没有登陆后台的,你能不能写个程序把用户名,密码之类的封装后获取后台文件的MD5值列表。。。

这是个问题,一开始没有什么头绪,因为这个就比上一个难了,上一个只是简单的执行一些后台shell,还是以文件形式执行的,plink貌似没有提供命令行选项去后台执行指令,所以想用python来解决了。和导师交流下,他说这个问题可以去看看Python的远程调试等等,不知道后来怎么说的,他告诉我说:这个非常简单,你把所有的东西都封到一个exe里就OK了,我倒。。。

按照他说的想法,我开始了我的设计:首先要有三个输入(当然这是逐步得到的结果,比较经济饿办法),这三个参数分别为待测试的设备IP,SSH后台的private key file另外就是已经有的后台文件MD5值获取脚本(.py的),输出就是MD5值对比文件,也就是md5change.log。

明确了输入输出,就要想如何实现了,本来是想自己再实现一个MD5值对比脚本,主要是因为之前的MD5值对比脚本的输出是文本文件格式的,而我想得到的输出stdout里的,然后自己再处理。后来想想有现成的就别麻烦了,直接下载对比后结果就可以了。

所以细化了实现的办法:沟造一个sftp client端,用来和后台交互文件,因为后台提供了sftp server;构造一个ssh client端用来在后台执行命令,这两点都明确了就好办了,去google: python ssh会获得比较成熟的模块(我一直认为这就是工具)paramiko,paramiko提供的主要API之一就是SSHClient,调用它提供的API可以完成在后台执行指令,这里主要前后卡壳两次,一次是编写简单代码后,系统提示:Unknown server ipaddress,这里网络上找了很久都没有进展,后来发现在构建简单的客户端之后添加
        t.set_missing_host_key_policy(paramiko.AutoAddPolicy())
就可以解决问题,这主要是源于ssh2本身的设置,第二步卡壳是在pkey上,SSH2支持两种加密private key加密方式RSA和DSA,而我一直使用本地的.ppk文件,后台通过查询相关资料,ppk是putty自身能够识别的文件格式,所以在RSA或者DSS解密private key file(ppk)文件时总是提示Invilid key file,后来通过使用putty自带的puttygen.exe获取了Openssh格式的private key file,这样才能正确的被paramiko.DSSKey.from_private_key_file(keyfile,password=password)读取,在这里也认识到了SSH2 public key authentication,即公钥验证的基本原理,这里大家可以参见:http://www.51testing.com/spacecp.php?action=spaceblogs&op=add&openwindow=1,
是一位强人的解释。
简单的SSH2 Client构建好了,就去执行指令了,这里执行的指令非常简单,一句而已。

然后就是想如何上传下载文件,因为都是需要认证的,而且paramiko的SSHClient本身提供了open_tftp()函数,可以建立连接然后put或者get文件,但为了我组内其它同事能够用更多的API,所以我使用tftp这个API,本身提供了get,put等文件操作。

最后一部就是将验证可运行无误的代码打包成为exe文件了,这里使用了py2exe,具体的打包办法可以参考http://www.chinaunix.net/jh/55/556861.html,比较老的帖子了,也比较简单。。。

打包完成之后尝试了下,没什么错误,OK了,就是一些调试信息忘记注释掉了。。。再打包一次又闲麻烦了,新人来了正好看调试信息~~~

TAG:

 

评分:0

我来说两句

Open Toolbar