`
小麦麦子
  • 浏览: 28911 次
文章分类
社区版块
存档分类
最新评论

spawn类发送与获取信息方法详解

阅读更多

  在spawn类当中我们需要学习的一些方法这里主要分为两类方法。

  第一类:其他发送信息方法

  第二类:其他获取结果方法

  这里面所谓其他发送信息就是由spawn类子程序发送相关的信息,包括子命令以及子命令运行的一些参数等等。其他获取结果方法是从子程序的返回中获取相应的信息。

  其他发送信息方法包括:send(s)。这个方法和前面所使用的sendline是类似的。只发送字符串给子程序,不添加回车符(换行符)。给子程序发送子命令时,发送了回车符才表示发送结束,才开始执行子子命令。所以sends在使用的时候结尾一定发一个换行符。如果打开了日志,则会添加到日志中,返回已返回发送字节数。

  writes):用于向子程序发送子命令或者子命令的参数。同send方法,但无返回值。

  writelines(sequence):可以将多行数据或者字符串放在一个列表,通过writeline依次发送给子程序。通过调用write()方法,将序列中内容发送。在发送时在结尾也不添加回车符或换行符。

  sendcontrol:向子程序发送类似ctrld,ctrlc等组合键。

  sendeof:发送一个结束符,一般用于确认上一次发送内容缓冲结束。这个意思就是说在发送子命令前,发送一个sendof这是表示上一次的命令已经发送完毕。

  sendintr:发送退出信号。

  从子程序获取结果:expect_exact用法与expect()相同,匹配速度更快,除pattern不能使用正则表达式。只能使用字符串,字符串的表达式比正则表达式更快,所以匹配效率会更高一些。

  expect_list:匹配列表只用已编译正则表达式和EOFTIMEOUT,提高匹配速度,expect()方法是通过它的工作的。如果在前面调用expect方法时,pattern.提供的是一个列表,包括正则表达式,此时expect会调用expect_list方法,将列表中的正则表达式全部进行编译,编译完以后,再进行匹配。

  reade(size=-1):从子程序输出中读取指定量数据,size为-1时读取时直到eof(当子程序退出后使用)“”

  readeline(size=-1):-1时直接读取一行数据,0时返回为空,其它值时被忽略,返回一行。

  首先我们尝试用send来多次发送一个子命令。当子命令被拆分为多个字符串时,可以用send进行多次发送。比如,向nslookup发送命令,可以使用child.send,第一次可以只发送域名,maiziedu.com,但是没有发送回车符,这时候这个作为子命令的话,不会被nslookup这条命令执行。紧接着,再发送回车符,这个地方少了一个child,发送一个回车符,这时这个子命令才会被运行。然后可以调用刚刚定义的getre这个方法,其它参数都不提供,使用默认值,刚才这个方法中参数出错了,所以从新进行匹配,直接输入child作为getre的参数。可以看到这个命令已经被执行了,这就是send方法的使用。



 

write方法的使用

  在前面每一次输入send方法的时候,在运行返回以后,总是返回一个错值,比如这里是16,表示发送了16个字节的数据。write在发送时只发送相应的信息,不反应相应的发送量。比如发送麦子学院域名给子命令,并且将回车符一并发送,可以看到是没有返回值的,也就是不会告诉你发送了多少个字符。再次调用getre这个方法,可以看到查询成功了,当然还可以调用writeline,将多个字符串放在同一个列表来进行发送。比如将麦子学院的域名和换行符作为一个列表发送给子命令,可以看到writeline也不返回数据,发送的多少字符串也不返回客户端。还可以调用getre方法来查询结果,查询结果很上面的是一致的。

  如果要接受子命令,可以按照刚刚sendcontrol也就是ctrld来接受子命令。也可以直接向子程序发送退出信号。

  现在用sendintr发送命令:可以直接调用方法,就可以将子程序结束。如何知道子程序是否结束,通过child实例方法进行判断。通过isalive,返回False表示子程序结束。在接着看,如何用另外两种方法对子程序返回结果进行匹配。

  首先启动nslookup,然后发送命令,就是子命令,依然是麦子学院域名,发送完成以后,可以使用expect_exact来对子程序的结果进行匹配。匹配时用法很expect相同,这里只能用字符串匹配。还可以调用getre这个方法,穿进去的参数要求调用exact方法进位匹配。这里匹配成功,这时候匹配成功并没有返回相应的查询信息,原因就是在刚刚在启动nslookup之后没有进行匹配,所以匹配到的是第一个返回的提示符,第二次查询还没有匹配到,可以再次调用这个方法。

  我们再进行一次,向子程序发送查询域名的指令,查询完以后,获取结果,这时候仍然调用前面定义的getre方法,这时传递给它的匹配的是列表。第一个是子命令的提示符,第二个是麦子学院的域名,可以看到这时候匹配的是成功的,首先匹配的是maiziedu而不是子命令的提示符。这里expect_list方法就不再进行演示了。最后看一下readreadline方法。

  read方法:首先运行子命令,然后通过调用read方法,比如为8,那么它会从结果当中读取8个字符,如果要获取一行,就可以调用readline,获取一行数据。如果要获取下一行数据,同样可以调用这个方法。如果要接受子程序,不仅可以调用刚刚所说的方法,还可以调用sendcontrol方法,弹入d将子程序结束掉。调用isalive,看子程序是否运行,False表示子程序结束。子程序结束以后就可以调用reade方法,来读取所有的信息,就是这些。



 

 

来源:麦子学院

原文链接:http://www.maiziedu.com/wiki/library/method/

  • 大小: 53.4 KB
  • 大小: 121.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics