Python学习——pexpect

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会额外发送一个回车

原文地址:https://www.cnblogs.com/DaLiNDluDlu/p/5250560.html