概述
下载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不行啊。
最后
以上就是虚心乐曲为你收集整理的Python中的SSH的全部内容,希望文章能够帮你解决Python中的SSH所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复