我是靠谱客的博主 虚心乐曲,最近开发中收集的这篇文章主要介绍Python中的SSH,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用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不行啊。

最后

以上就是虚心乐曲为你收集整理的Python中的SSH的全部内容,希望文章能够帮你解决Python中的SSH所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部