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后会退出,而不是留在远程终端。