感谢。
但是需要帐户和密码。所以我必须发送它们然后发送ovs-vsctl命令。
脚本是这样的:
spawn telnet@ip
expect -re "*login*" {
send "root"
}
expect -re "password*" {
send "****"
}
send "ovs-vsctl *******"
我想存储此命令send "ovs-vsctl ****"
的输出,但很多时候我得到了命令的输出"发送"密码"",我怎么能得到send "ovs-vsctl****"
的输出。命令send "ovs-vsctl ***
的输出是两个字符串,每个字符串占一行。
感谢。
答案 0 :(得分:8)
也许:
log_user 0 ;# turn off the usual output
spawn telnet@ip
expect -re "*login*"
send "root\r"
expect -re "password*"
send "****\r"
send "ovs-vsctl *******"
expect eof
puts $expect_out(buffer) ;# print the results of the command
答案 1 :(得分:5)
Expect适用于输入缓冲区,其中包含从交互式应用程序返回的所有,这意味着进程输出和您的输入(只要它是从远程设备,通常是这种情况。)
expect
命令用于从输入缓冲区恢复文本。每次找到匹配项时,清除直到该匹配结束的缓冲区,并保存到$ expect_out(缓冲区)。实际匹配保存到$ expect_out(0,string)。然后缓冲区重置。
在您的情况下,您需要做的是将输出与expect
语句匹配,以获得您想要的结果。
在您的情况下我会做的是在发送密码后匹配远程设备提示,然后在发送命令后再次匹配。这样,最后一次匹配后的缓冲区将保存所需的输出。
有些事情:
[...]
expect -re "password*" {
send "****"
}
expect -re ">"
send "ovs-vsctl *******\r"
expect -re ">" # Better if you can use a regexp based on your knowledge of device output here - see below
puts $expect_out(buffer)
通过根据您对输出的了解使用正则表达式进行匹配,您应该只能提取命令输出而不能提取回显命令本身。或者你可以使用regexp
命令在事后做到这一点。
希望有所帮助!