pexpect库run函数的使用详解
前面我们pexpect库的spawn类的方法,在pexpect库中,除了spawn类以外,还有其他工具和类。现在来看在pexpect库中有哪些其他工具和类。
其他工具和类
1、run函数,是pexpect库中用于运行简单命令的基本函数。主要用于快速运行不用与其交互或仅需很少交互的程序。
2.它是简化版的spawn类。
3.直接返回子程序运行的输出信息。
4.commond主要是用于提供一个单独的命令行,或者带参数的命令行。在run函数中其他相关参数和spawn类的构造方法的参数基本是一样的。
5.在run这个函数中,withexistatus为True时,返回输出和退出状态。也就是说如果将这个参数为默认值,此时在run函数在运行完子程序以后,直接输出的就是群运行的程序,它的所有的输出信息。如果将这个参数为True时,run函数不仅返回子程序的输入信息,同时还返回子程序的退出状态,一般的正常退出为0。
对run函数,还可以用于与子程序进行简单的交互,实现与子程序进行交互的参数是events。
events几种形式
1.列表形式。在列表的每一项中,给出了子程序输出某种信息时我们应该给它的应答是什么。
2.字典形式。即字典的建是用于匹配的项。字典的建所定的值是应答子程序的字符串。要注意的是这里应答子程序的字符串的末尾应有\n换行符。
pattern是要匹配的正则表达式或者字符串。resp可以是子命令。resp可以是一个函数,接受一个字典参数,其中保存的是run()中定义的变量及其值。
run函数基本使用的实例
首先打开虚拟机,启动一个终端,启动Python3,导入pexpect库。首先看一下,用run来运行一个基本的命令,比如运行ls目录,这时我们指定它的工作目录。和spawn类一样,我们可以指定cwd这个参数。可以看到ls这个命令运行完以后,相应的信息也输出了。为了观看的方便,还可以将它进行解码。复制它,可以看到这里列出了home djx目录下的所有文件,以及文件夹,当然在 run的参数中,子命令中,我们还可以为ls命令提供一个参数,比如:加上一个-l。同样还是让它列出djx目录下的文件和目录。它列出的信息比ls单独的不带参数的要更详细一些。
现在来看,当提供withexitstatus参数为true时,它的返回状况。我们运行最简单的withexitstatus,可以看到此时的返回是一个原主的形式。它的原主的第一个部分从这个位置到这个位置的命令输出,然后后面跟一个0,表示运行的ls这条命令是正常退出的返回码为0。当然run函数还可以通过events这个参数与子程序进行交互。
下面我们用run的events参数与子程序交互的方法。首先尝试通过ftp命令来登录服务器,然后登录完以后再退出这个服务器。首先启动服务器,查看本机的ip地址可以看到本机的ip地址为192.168.1.3,下面调用run这个函数,来登录ftp服务器。输出的结果保存在out中。提供的参数为ftp192.168.1.3 ,提供交互的参数为events。由于这个交互的参数既可以为列表也可以为字典形式,这里首先用字典形式来定义交互。登录ftp的用户名为命名用户,这里要提供换行符。登录的密码为ab这个简单的字符串,也要提供换行符。登录成功时,服务器返回的是230,然后输入fine直接退出。输出out,可以看到此时已经连接到ftp服务器上了。当连接完成以后,输入fine命令退出服务器。通过ftp的日志也可以看出登录了ftp服务器使用命名用户,然后使用ab来通过登录,最后退出ftp服务器。
下面我们将为run提供一个events参数,events参数为列表形式,同样的输出信息放到out中,此命令为192.168.1.3,也就是访问本机的ftp服务器。第一个仍然是匹配name,也就是输入用户名为命名用户,密码为ab,当要求用户输入密码的时候,就用ab来替代。当成功登录时候返回的是230代码,并输入fine来退出ftp。查看out,可以看出也是连接上ftp服务器,并且成功以后也退出了登录。这里是以字典的形式,这里是以列表的形式提供参数的。下面接着看对这个应答信息,提供一个函数作为一个参数的情况,首先定义一个函数,它需要接受一个参数d,也就是一个字典参数,在这个应答信息中,我们不进行其他的动作,也就是返回为空,但我们将run这个函数它相关选项直接打印出来。然后我们视图运行nslookup,查询麦子学院的ip地址。然后提供events参数,当输出的信息中含有server,就调用这个resp函数。可以看到运行的时候它匹配到了这个server,这个输出信息中有server内容。此时会调用resp这个函数,输出d也就是run当中所定义的所有变量字典。这个字典正好在这个位置。