Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88660
  • 博文数量: 30
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 16:34
文章分类

全部博文(30)

文章存档

2010年(2)

2009年(24)

2008年(4)

我的朋友

分类: LINUX

2009-05-25 16:29:43

系统管理常常要使用脚本自动定时获取远程服务器信息或者备份,使用rsa key固然也可以解决,但是我们何不换个脚本,不在服务器上作任何修改,只在客户机上完成。

Pexpect 是 Don Libes 的 的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh, ftp , telnet 等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。

安装:
download pexpect-2.3.tar.gz
tar zxvf pexpect-2.3.tar.gz
cd pexpect-2.3
python setup.py install (do this as root)

应用:
  • 远程ssh使用命令
#!/usr/bin/env python
import pexpect

ssh_newkey = 'Are you sure you want to continue connecting'
# my ssh command line
p=pexpect.spawn('ssh mysurface@192.168.1.105 uname -a')

i=p.expect([ssh_newkey,'password:',pexpect.EOF])
if i==0:
print "I say yes"
p.sendline('yes')
i=p.expect([ssh_newkey,'password:',pexpect.EOF])
if i==1:
print "I give password",
p.sendline("mypassword")
p.expect(pexpect.EOF)
elif i==2:
print "I either got key or connection timeout"
pass
print p.before # print out the result
  • 保持ssh连接

#!/usr/bin/env python
import pexpect
import struct, fcntl, os, sys, signal

def sigwinch_passthrough (sig, data):
# Check for buggy platforms (see pexpect.setwinsize()).
if 'TIOCGWINSZ' in dir(termios):
TIOCGWINSZ = termios.TIOCGWINSZ
else:
TIOCGWINSZ = 1074295912 # assume
s = struct.pack ("HHHH", 0, 0, 0, 0)
a = struct.unpack ('HHHH', fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ , s))
global global_pexpect_instance
global_pexpect_instance.setwinsize(a[0],a[1])

ssh_newkey = 'Are you sure you want to continue connecting'
p=pexpect.spawn('ssh mysurface@192.168.1.105')
i=p.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT],1)
if i==0:
print "I say yes"
p.sendline('yes')
i=p.expect([ssh_newkey,'password:',pexpect.EOF])
if i==1:
print "I give password",
p.sendline("mypassword")
elif i==2:
print "I either got key or connection timeout"
pass
elif i==3: #timeout
pass
p.sendline("\r")
global global_pexpect_instance
global_pexpect_instance = p
signal.signal(signal.SIGWINCH, sigwinch_passthrough)

try:
p.interact()
sys.exit(0)
except:
sys.exit(1)

Twisted Conch和paramiko也是另外的python extension,同样可以实现

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


阅读(1513) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-01-08 21:56:30

pexpect也带了一个pxssh的工具,请问如何用pxssh来实现上面两个功能?