1、介绍pexpect
通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令进行自动交互,不需要人工干预达到自动目的。
2、pexpect的组件介绍
2.1、spawn类
作用:启动和控制子应用程序,其构造函数如下:
class pexpect.spawn(command,args=[],timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,env=None,ignore_sighup=True)
其中command是任意已知的系统命令,timeout是等待结果的超时时间,maxread是从终端一次读取的最大字节数,searchwindowsize是匹配缓冲区字符串的位置。
注意点:pexpect不会解析shell命令中的元字符(重定向>,管道|,通配符*),不过将存在这三个特殊元字符的命令作为/bin/bash的参数进行调用,可以解决这个问题。比如:
child=pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"')
child.expect(pexpect.EOF)
将命令的参数以Python列表形式替换:
shell_cmd = 'ls -l | grep LOG >logs.txt'
child=pexpect.spawn('/bin/bash',['-c',shell_cmd])
child.expect(pexpect.EOF)
调试代码是,pexpect提供两种方式可以查看输入输出:1>写入到日志 2>输出到stdout
child=pexpect.spawn('some_cmd')
fout=file('mylog.txt','w')
child.logfile = fout
或者:child.logfile=sys.stdout
其中expect方法定义了一个子程序输出的匹配规则:
定义的方法是expect(pattern,timeout=-1,searchwindowsize=-1)
pattern表示字符串、pexpect.EOF(指向缓冲区尾部)、pexpect.TIMEOUT、正则表达式。
send向子程序发送相应命令,相当于标准输入键盘
send(self,s)发送命令,不回车
sendline(self,s='')发送命令,回车
sendcontrol(self,char)发送控制字符,如child.sendcontrol('c')相当于ctrl+c
sendeof()发送eof
2.2>run函数
run是使用pexpect进行封装的外部命令的函数
run(command,timeout=-1,withexitstatus=False,events=None,extra_args=None,logfile=None,cwd=None,env=None)
import pexpect
pexpect.run('scp filename user@ip:~',events={'(?)password':mypassword})
3、pxssh
pxssh针对ssh会话操作做了一层封装,提供了更加直接的操作方式
pxssh常用方法:login()建立ssh链接,logout()断开连接,prompt()等待系统提示符,用户等待命令执行完毕。