如何编写“期望”脚本来:
迭代 IP 地址列表并登录每个地址来执行命令(就像在 BASH for 循环中一样)。现在,我只是复制/粘贴了我的 Expect 脚本的几行,并手动放入每个设备的每个唯一 IP - 我知道效率不高。
Expect 是否接受用户输入并将其写入变量(如 BASH 中的“读取”)?我想编写一个脚本,其中包含以下内容:“输入路由器的IP地址”“输入要检查的路由器上的端口”,然后启动Expect,SSH到该IP地址,并运行一些命令使用该路由器端口。
答案1
我返回到“Exploring Expect”并发现,显然,如果某些expect
语句失败,则将expect
其视为文件结尾(eof),并退出,也退出脚本。所以,我简单地补充道:
expect {
{eof} {action_here}
}
它有效。
答案2
这个问题更多的是目标导向,而不是特定于所提到的技术,所以我只是根据我的精神来解决这个问题。我将使用Python。
回复:问题 1:
基本上,听起来您想从文件中解析 ip/地址,并为每个 ip 地址运行期望(类似)的来回序列。
您不想从 except 脚本中解析 ip 地址,而是想使用 python 从文件中解析 ip 地址,并对每个 ip 地址运行相同的 Expect 命令。
因此,您需要编写将 ipaddress 作为变量的 expect 命令,以便对于循环中的每个 ipaddress,您都可以为该变量分配不同的 ipaddress 并执行 expect 命令。
至于“expect”之类的功能,请看一下“pexpect”库:它是一个 python 模块,向您的 python 脚本公开expect 之类的功能。 (请参阅此答案,其中包含示例以及其他文档/示例的链接:https://stackoverflow.com/a/11160553/1248361)。让我们充实一下:
查看上述链接中的示例,请注意期望序列以“””开头
child = pexpect.spawn('某个需要密码的命令') child.expect('输入密码') child.sendline('密码')
""" 您可以轻松地将 pexpect.spawn 方法的字符串参数替换为 pexpect.spawn('some command that require a password that take an ipaddress as an option' + ipaddress_variable)
因此,在 python 中,我只需定义一个函数,该函数将期望序列的一部分作为参数,该部分将在 for 循环的每次迭代中发生变化,并使用变量参数。
像这样(这是伪代码):
def Expect_function(ipaddress_variable): pexpect.spawn('某些需要密码的命令' +ipaddress_variable) child.expect('输入密码') child.sendline('password') child.expect..... (这里是哪里您接管并在远程计算机上执行您需要执行的操作)
(抱歉,格式、预置和代码没有达到我的预期)
定义好该函数后,剩下的就很简单了。
只需循环您的 IP 地址并调用该函数,如以下伪代码:
对于 ipfile 中的 ipaddress:expect_function(ipaddress)
第二个问题我也会通过Python来处理。