python-5-pexpect交互模块

pexpect用来启动一个子进程,实现在不同的机器上自动交互,例如ssh,ftp,telnet等


由于属于第三方库,所以需要单独安装

wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz
sudo python ./setup.py install


run函数,一个简单版的spawn,类似于os.system,但是他比os.system相比,不仅仅返回结果,还能以元组的形式返回状态码
run(command,timeout=-1,withexitstatus=False,event,extra_args=None,logfile=None,cwd=None,env=None)

使用前先导入模块
from pexpect import *

>>> run('pwd')
'/data/shell\r\n'

返回状态码
>>> run('pwd',withexitstatus=1)
('/data/shell\r\n', 0)


spawn类
比run更强大,可以实现更复杂的交互

工作过程:
#第一步,与终端建立连接
child=pexpect.spawn('scp foo user@example.com:.')

#第二步,等待终端返回特定内容
child.expect('Password:')

#第三步,根据返回内容发送命令进行交互
child.sendline(mypassword)

pxssh类
它是pexpect的派生类,用于ssh连接

login()建立和目标的ssh连接
logout()释放该连接
prompt()等待提示符,通常用于等待命令执行结束

工作过程如下,同pexpect

pxssh需要导入模块
import pxssh
import getpass

#初始化pxssh实例
s=pxssh.pxssh()

hostname=raw_input('hostname: ')
username=raw_input('username: ')
password=getpass.getpass('password: ')

#建立ssh连接
s.login(hostname,username,password)

#发送命令道远程终端
s.sendline('uptime')   #run a command

#等待终端返回
s.prompt()  #match the prompt

#打印匹配的内容
print s.before  #print everything before the propt

s.sendline('ls -l')
s.prompt()
print s.before

s.sendline('df -h')
s.prompt()
print s.before

#释放ssh连接
s.logout()

报错:
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().

解决办法:
find / -name "pxssh.py"
vim /usr/lib/python2.6/site-packages/pxssh.py

在def synch_original_prompt (self):方法下第一个self.read_nonblocking(size=10000,timeout=1) 前面增加两行代码 

self.sendline()  
time.sleep(0.5)


其他说明:
如果在脚本最后有
child.interact()
那么最后终端会停在远程机器上
注释掉这句,则执行完ssh后,仍在本机上

interact的作用:
执行完成后保持交互状态,把控制权交给控制台,此时可以手工操作了。
如果没有这句,登录ssh后会退出,而不是留在远程终端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值