Pexpect主要用于ssh远程登录,远程管理等。
http://pexpect.sourceforge.net/pexpect.html#spawn-expect
简单举例,防止忘记
1 #!/usr/bin/env python 2 import pexpect 3 4 child = pexpect.spawn("ssh root@192.168.0.1") 5 fout = open('/root/lwt/mylog.log','a') 6 child.logfile = fout 7 index = child.expect(["[Pp]assword:",pexpect.EOF]) 8 if index == 0: 9 child.sendline("NextGen") 10 child.expect("]#") 11 child.sendline("ls -l") 12 child.expect("]#") 13 else: 14 print "Error!" 15 return
logfile:指定logfile,记录操作过程中的输入输出信息;如果只记录输入信息,用log_read;如果只记录输出信息,用log_send;
import pexpect p = pexpect.spawn( ‘ ls -l ’ ) fout = open ('log.txt', "w") p.logfile = fout
p.expect(pexpect.EOF) #read_nonblocking以后才会写入文件 fout.close()
调用 send 后,才会往 logfile 和 logfile_send 中写入,sendline/sendcontrol/sendoff/write/writeline 最终都会调用 send,所以 sendline 后 logfile 中一定有内容了,只要此时 logfile 没有被 close 。
调用 read_nonblocking 后,才会往 logfile 和 logfile_read 中写入,expect_loop 会调用 read_nonblocking,而 expect_exact 和 expect_list 都会调用 expect_loop,expect 会调用 expect_list,所以 expect 后 logfile 中一定有内容了,只要此时 logfile 没有被 close 。
expect:expect可以是一个list
expect在流中匹配,直到匹配到一个模板,如果pattern是list,返回match的index,如果pattern不是list,返回0表示匹配成功,为了避免EOF和TIMEOUT,将其加入pattern的list。
# the input is 'foobar'
index = p.expect (['bar', 'foo', 'foobar'])
# returns 1 ('foo') even though 'foobar' is a "better" match
index = p.expect (['foobar', 'foo'])
# returns 0 ('foobar') if all input is available at once,
# but returs 1 ('foo') if parts of the final 'bar' arrive late
sendline:和send不同,sendline会额外发送一个回车