如何过滤 Expect 脚本中命令的输出
How to filter output from a command in an Expect Script
我正在编写一个登录服务器并查找应用程序 ID 的自动化脚本。我正在使用 expect 脚本,以便在收到提示后登录到每个服务器。当我登录时,有一堵默认文本墙(安全通知等)我试图在登录到服务器后存储命令的输出,但没有找到任何运气。任何建议表示赞赏
这是针对 Linux 服务器的。我试过使用 $expect_out(buffer) 但没有运气在开始时将登录消息静音。
ssh -l <userid> <servername>
expect "$prompt" {send "ps -ef|grep java| grep -i 'jboss' |cut -f1 -d' '\r"}
set id $expect_out(buffer)
exec ./output.sh $id
我收到的输出是登录消息的一个子字符串。
你的问题是two-fold:
- 您没有在
send
命令后 expect
进行响应。否则,当您尝试从响应中提取 ID 时,响应可能实际上不会被处理。
expect_out(buffer)
变量很容易包含您想要的文本以外的文本。您需要有选择性地进行匹配,例如,使用正则表达式和 -re
选项以`expect.
我猜解决方法是将第三行更改为:
expect -re {(\d+)\n} {
set id $expect_out(1,string)
}
当您无法弄清楚您的 expect 脚本出错的原因时,请记住打开调试模式。它通常会准确说明(紧迫的)问题是什么,这有很大帮助……
我找到了解决方案。为了从我的命令中获得响应,我使用了以下代码:
expect "$prompt"
set cmd "ps -ef|grep java|grep -i 'tomcat' | cut -f1 -d' '\r"
send -- $cmd
expect eof
expect -re "$ ps -ef | grep java | grep -i 'tomcat' | cut -f1 -d' '\r\n(.*)\r" {set output $expect_out(1,string)}
我将期望值设置为包含命令(带有提示)并使其继续到我想要的输出所在的下一行。然后我将我的变量 $output 设置为 $expect_out(1,string) 它接受除预期值之外的所有内容,因此给我我的命令输出。
我正在编写一个登录服务器并查找应用程序 ID 的自动化脚本。我正在使用 expect 脚本,以便在收到提示后登录到每个服务器。当我登录时,有一堵默认文本墙(安全通知等)我试图在登录到服务器后存储命令的输出,但没有找到任何运气。任何建议表示赞赏
这是针对 Linux 服务器的。我试过使用 $expect_out(buffer) 但没有运气在开始时将登录消息静音。
ssh -l <userid> <servername>
expect "$prompt" {send "ps -ef|grep java| grep -i 'jboss' |cut -f1 -d' '\r"}
set id $expect_out(buffer)
exec ./output.sh $id
我收到的输出是登录消息的一个子字符串。
你的问题是two-fold:
- 您没有在
send
命令后expect
进行响应。否则,当您尝试从响应中提取 ID 时,响应可能实际上不会被处理。 expect_out(buffer)
变量很容易包含您想要的文本以外的文本。您需要有选择性地进行匹配,例如,使用正则表达式和-re
选项以`expect.
我猜解决方法是将第三行更改为:
expect -re {(\d+)\n} {
set id $expect_out(1,string)
}
当您无法弄清楚您的 expect 脚本出错的原因时,请记住打开调试模式。它通常会准确说明(紧迫的)问题是什么,这有很大帮助……
我找到了解决方案。为了从我的命令中获得响应,我使用了以下代码:
expect "$prompt"
set cmd "ps -ef|grep java|grep -i 'tomcat' | cut -f1 -d' '\r"
send -- $cmd
expect eof
expect -re "$ ps -ef | grep java | grep -i 'tomcat' | cut -f1 -d' '\r\n(.*)\r" {set output $expect_out(1,string)}
我将期望值设置为包含命令(带有提示)并使其继续到我想要的输出所在的下一行。然后我将我的变量 $output 设置为 $expect_out(1,string) 它接受除预期值之外的所有内容,因此给我我的命令输出。