一、expect
expect是自动化工具中的经典之一,用于模拟用户输入,实现自动化操作。例如,一个需要交互才能完成的ssh连接,可以使用expect自动化输入密码。
import pexpect ssh = pexpect.spawn('ssh localhost') ssh.expect('password:') ssh.sendline('passwd')
以上代码通过模拟ssh登录的密码输入,实现了自动化登录。其中ssh.expect()函数的作用是匹配输入流中的“password:”,一旦匹配成功,就会进入ssh.sendline()函数执行密码输入操作。
二、unexpected
当然,现实总是充满了惊喜。在有些情况下,我们并不能确定输入流中会出现什么内容。这时,可以使用unexpected函数匹配到任何未知的字符。例如:
import pexpect ssh = pexpect.spawn('ssh localhost') ssh.expect('assword:') ssh.sendline('passwd') print(ssh.before)
以上代码可以自动输入密码,但是假如密码输入错误了,就需要重新输入。这时,pexpect就提供了unexpecetd函数来应对未知的字符。例如:
import pexpect ssh = pexpect.spawn('ssh localhost') try: ssh.expect('assword:', timeout=5) ssh.sendline('wrongpasswd') except pexpect.exceptions.TIMEOUT: ssh.sendline('rightpasswd') print(ssh.before)
以上代码通过设置pexpect.exceptions.TIMEOUT异常来进行处理。如果5秒内输入流中没有出现“assword:”,则会自动执行ssh.sendline('rightpasswd')。
三、expected
有时,我们需要等待某些指定的固定字符出现后进行操作。例如:
import pexpect ssh = pexpect.spawn('ssh localhost') ssh.expect('password:') ssh.sendline('passwd') ssh.expect('localhost') ssh.sendline('exit') print(ssh.before)
以上代码可以登录ssh,执行一个命令,然后退出。当执行ssh.expect('localhost')时,pexpect就会等待"localhost"这个字符串的出现。
四、unexpectedly
当需要匹配到多个未知的字符时,可以使用unexpectedly函数。
import pexpect ssh = pexpect.spawn('ssh localhost') ssh.expect('assword:') ssh.sendline('passwd') ssh.unexpectedly(['$', '#']) ssh.sendline('ls') print(ssh.before)
以上代码可以在ssh连接后执行ls命令,当输入流中出现了'$'或'#'时,pexpect就会停止等待,开始执行下一条指令。
总之,pexpect是自动化工具中一款强大的模拟工具,既可以匹配固定的预期字符,也可以适应未知的输入流情况。全能编程开发工程师必备!