在spawn类当中我们需要学习的一些方法,这里主要分为两类方法。
第一类:其他发送信息方法
第二类:其他获取结果方法
这里面所谓其他发送信息就是由spawn类子程序发送相关的信息,包括子命令以及子命令运行的一些参数等等。其他获取结果方法是从子程序的返回中获取相应的信息。
其他发送信息方法包括:send(s)。这个方法和前面所使用的sendline是类似的。只发送字符串给子程序,不添加回车符(换行符)。给子程序发送子命令时,发送了回车符才表示发送结束,才开始执行子子命令。所以sends在使用的时候结尾一定发一个换行符。如果打开了日志,则会添加到日志中,返回已返回发送字节数。
write(s):用于向子程序发送子命令或者子命令的参数。同send方法,但无返回值。
writelines(sequence):可以将多行数据或者字符串放在一个列表,通过writeline依次发送给子程序。通过调用write()方法,将序列中内容发送。在发送时在结尾也不添加回车符或换行符。
sendcontrol:向子程序发送类似ctrl+d,ctrl+c等组合键。
sendeof:发送一个结束符,一般用于确认上一次发送内容缓冲结束。这个意思就是说在发送子命令前,发送一个sendof这是表示上一次的命令已经发送完毕。
sendintr:发送退出信号。
从子程序获取结果:expect_exact用法与expect()相同,匹配速度更快,除pattern不能使用正则表达式。只能使用字符串,字符串的表达式比正则表达式更快,所以匹配效率会更高一些。
expect_list:匹配列表只用已编译正则表达式和EOF、TIMEOUT,提高匹配速度,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也就是ctrl+d来接受子命令。也可以直接向子程序发送退出信号。
现在用sendintr发送命令:可以直接调用方法,就可以将子程序结束。如何知道子程序是否结束,通过child实例方法进行判断。通过isalive,返回False表示子程序结束。在接着看,如何用另外两种方法对子程序返回结果进行匹配。
首先启动nslookup,然后发送命令,就是子命令,依然是麦子学院域名,发送完成以后,可以使用expect_exact来对子程序的结果进行匹配。匹配时用法很expect相同,这里只能用字符串匹配。还可以调用getre这个方法,穿进去的参数要求调用exact方法进位匹配。这里匹配成功,这时候匹配成功并没有返回相应的查询信息,原因就是在刚刚在启动nslookup之后没有进行匹配,所以匹配到的是第一个返回的提示符,第二次查询还没有匹配到,可以再次调用这个方法。
我们再进行一次,向子程序发送查询域名的指令,查询完以后,获取结果,这时候仍然调用前面定义的getre方法,这时传递给它的匹配的是列表。第一个是子命令的提示符,第二个是麦子学院的域名,可以看到这时候匹配的是成功的,首先匹配的是maiziedu而不是子命令的提示符。这里expect_list方法就不再进行演示了。最后看一下read和readline方法。
read方法:首先运行子命令,然后通过调用read方法,比如为8,那么它会从结果当中读取8个字符,如果要获取一行,就可以调用readline,获取一行数据。如果要获取下一行数据,同样可以调用这个方法。如果要接受子程序,不仅可以调用刚刚所说的方法,还可以调用sendcontrol方法,弹入d将子程序结束掉。调用isalive,看子程序是否运行,False表示子程序结束。子程序结束以后就可以调用reade方法,来读取所有的信息,就是这些。
来源:麦子学院
原文链接:http://www.maiziedu.com/wiki/library/method/
相关推荐
- `send_user`: 类似于 shell 中的 `echo` 命令,用于显示信息给用户,并不会发送到 `spawn` 的进程。 #### 二、示例详解 下面通过一个具体的示例来展示如何使用 expect 自动创建 Linux 用户: ##### 2.1 创建...
Linux中的`expect`工具是一个强大的自动化脚本工具,主要用于与命令行交互,特别是与需要用户输入的程序进行自动化通信,如SSH登录、FTP传输等。它基于TCL语言,因此在使用`expect`之前需要先确保系统安装了TCL和...
7. **rpc/**:包含与分布式运行相关的类和方法。 #### 二、main.py模块详解 **1. 参数解析:** `main.py`模块是整个程序的入口点,它通过命令行参数接收用户输入,并根据这些参数来执行相应的操作。例如,用户...
客户端则通过`NetworkClient.Connect()`连接到服务器,一旦连接成功,就可以通过`NetworkClient.Send()`发送消息,或者通过`NetworkClient.Spawn()`获取服务器上的游戏对象。 在“Assets”目录下,包含了游戏逻辑...
- `enable()`, `disable()`, `get_handle()`, `set_handle()`:这些方法用于控制句柄的状态和获取句柄信息。 - **ACE_SOCK**:提供Socket操作的基础功能。 - `get_local_addr()`, `set_local_addr()`, `open()`, `...
这里以监控内存为例,展示如何通过SSH连接到远程服务器并获取内存信息。 ```python import pexpect import re import threading def ssh_command(user, host, password, command): ssh_new_key = 'Are you sure ...
《Windows环境下 Expect 的安装与应用详解》 在IT领域,自动化是提高效率的关键。Expect工具在Unix/Linux环境中广泛用于自动化脚本,特别是处理交互式命令行任务。然而,对于Windows用户, Expect 可能并不常见,但...
例如,通过引入 `org.bukkit.command.CommandSender` 和 `org.bukkit.command.Command` 对象,可以获取命令发送者的信息和命令的完整参数列表,实现动态的命令处理。 此外,Java 作为 Spigot 的编程语言,提供了...
- **unwrap 与 expect:** 用于获取 `Option` 中的值,但若为 `None` 会引发恐慌。 #### 五、模块与包 **5.1 模块系统** - **mod 关键字:** 用于定义模块。 - **use 关键字:** 用于引入模块中的项。 - **pub ...
### EVE单机版GM命令详解 #### 概述 EVE单机版是一款基于EVE Online的游戏模组,允许玩家在离线环境中体验宇宙探索、贸易、战斗等核心游戏元素。本文将详细介绍EVE单机版中的GM(Game Master)命令,这些命令为...
### Rust学习思维导图知识点详解 #### 一、基础知识 **1.1 变量与常量** - **变量绑定(let)**: Rust 使用 `let` 关键字来声明一个变量,并通过它来绑定一个值。 - 示例:`let x = 5;` - **可变变量(mut)**: ...
### Expect中文教程详解 #### 一、Expect简介与应用场景 **Expect** 是一种脚本语言,主要用于自动化交互式任务,特别是在远程登录(如通过Telnet或FTP)进行系统管理及软件测试方面。对于系统管理员来说,经常...
`pexpect.spawn(cmd)`创建一个新的子进程来运行命令,`expect(pexpect.EOF)`等待命令执行完成或遇到文件结束符(EOF),`child.before`获取命令执行前的所有输出。 #### 脚本分析 1. **初始化**: - 首先定义了...