Python中的SSH

来源:互联网 发布:太子妃升职记网络剧 编辑:程序博客网 时间:2024/05/29 04:34
使用SSH client连接可以使用paramiko或者使用Pexpect,这些都可以自动化连接SSH并进行预先安排的操作,只不过,在连接SSH的时候,需要提前准备SSH私钥,为了简便,用openssh自动创建

下载open ssh客户端(如果用pexpect,那么可以调用openssh客户端)

yum install openssh-clients

先下载Pexpect模块,Pexpect模块并不是python的标准内置模块,所以需要先下载安装才可以使用

easy_install Pexpect

一切都是自动的,我最喜欢这个了

在调用pxssh进行ssh连接之前,先用ssh客户端连接一下,以便生成密钥

ssh –l user –p 22 192.168.1.104

查看密钥的生成,主要是查看known_hosts

cat ~/.ssh/*

在ipython中导入这个模块

import pexpect

pexpect模块中有派生类Pxssh,可以直接建立一个SSH连接,比pexpect直接调用ssh要好使的多

import pxssh

try:


s=pxssh.pxssh()

hostname=’192.168.1.104’

username=’todd’

password=’******’

#调用login()函数

s.login(hostname,username,password)

#调用sendline()函数发送一个命令,例如pwd

s.sendline(‘pwd’)

#调用prompt()等待命令执行完毕

s.prompt()

#before属性显示在prompt()函数之前的显示

s.before

#如果操作系统是中文,那么避免显示乱码,可以使用print()函数

#print(s.before)

s.sendline(‘df -h’)

s.prompt()

print(s.before)

#如果此时再进行ssh连接,个人感觉应该重新建立一个pxssh实例,在远端机器上继续运行,没条件测试


except pxssh.ExceptionPxssh,e:


print( str(e))


这个感觉非常有用,以前在公司里面就遇到过类似的问题,需要先用ssh登陆到一台终端上,然后在这个终端上再使用ssh连接到真正的服务器上,在服务器上进行用户的密码修改,这个时候ssh的自动登陆连接就起到它应有的作用了。

有条件就来一下模拟,嘿嘿,这个想起来不是很难,可以虚拟出两台服务器做这个测试,等有机会再说

除了用pexpect内置的pxssh来连接,还有一种方法是直接调用pexpect来进行ssh访问,进行自动任务,个人测试了一下,这个方法还是挺好玩的

其中,expect()是正则表达式,可以加很多正则表达式,例如s.expect(‘string1’,’string2’,’string3’),如果符合string1,就返回0,符合string2,就返回1。

看出来了吧,就是返回index值啊,特么的,害我看下面的代码,迷糊了半天,下面的代码说明了这点

index = p.expect (['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
if index == 0:
   do_something()
elif index == 1:
  do_something_else()
elif index == 2:
  do_some_other_thing()
elif index == 3:
  do_something_completely_different()

使用pexpect类还有一个不方便的地方,就是没有返回结果,这个问题困扰了我半天,怎么也找不到解决方法,最后终于找到了,我擦,原来是把返回放到了log里面

现在写一个使用openssh client访问ssh server的自动python脚本,用pexpect类

#!/usr/bin/env python

import pexpect

import sys

s=pexpect.spawn(‘ssh’,[‘todd@192.168.1.104’])

#将返回写到屏幕输出,当然也可以写到一个文件里面,以后保存起来

s.logfile_read=sys.stdout

#设置expect的正则表达式,来定位具体的输出,例如密码的输入位置

s.expect(‘password:’)

#调用sendline()来输出密码,以后往ssh里面输入命令,都需要使用send()或sendline(),具体区别看文档

s.sendline(‘******’)

#这时候输入一个命令,例如uname –a

s.sendline(‘uname -a’)

#定位输出字符串,一般使用上一次输入的命令即可,例如uname

s.expect(‘uname’)

#这个功能对于一般的脚本来说用处不大,人家直接写到日志里面,谁会给你写到屏幕上?测试一下还可以,下面是显示结果

uname -a
Linux python-host 2.6.32-220.4.1.el6.x86_64 #1 SMP Tue Jan 24 02:13:44 GMT 2012 x86_64 x86_64 x86_64 GNU/Linux
[todd@python-host ~]$

#关闭ssh连接

s.close()

 

如果要写脚本,就必须加上条件判断,到时候再润色一下就可以了。

主要参考了如下资料

http://pexpect.sourceforge.net/pexpect.html#spawn-send

http://pexpect.sourceforge.net/pxssh.html

http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/

http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2/

IBM里面的应用不错,特别是那个登陆FTP下载东西的,如果这样的话,那么以后可以做很多事了,Linux真是强大啊,Windows不行啊。

0 0
原创粉丝点击