如何在Expect脚本中过滤命令的输出

时间:2019-07-22 19:10:34

标签: bash tcl expect

我正在编写一个自动化脚本,该脚本登录服务器并找到应用程序ID。我正在使用Expect脚本,以便在出现提示后登录到他的每个服务器。登录时,有一堵默认文本(安全通知等),我尝试在登录服务器后存储命令的输出,但这样做没有任何运气。任何建议表示赞赏

这是针对Linux服务器的。我试过使用$ expect_out(buffer),但是在开始时没有屏蔽登录消息的运气。

https://gitlab.xx.local/api/v4/projects/<project-x-id>/archive

我收到的输出是登录消息的子字符串。

2 个答案:

答案 0 :(得分:0)

您的问题有两个:

  1. expect命令之后,您没有send响应。否则,您尝试从响应中提取ID时,响应实际上可能不会被处理。
  2. expect_out(buffer)变量可以很容易地包含所需文本以外的其他文本。您需要对匹配进行选择,例如,使用正则表达式和使用-re选项进行`expect。

我猜测解决方法是将第三行更改为:

expect -re {(\d+)\n} {
    set id $expect_out(1,string)
}

记住,每当您无法弄清预期脚本为什么出错时,就打开调试模式。它通常可以准确说明(立即)问题是什么,这对您有很大帮助……

答案 1 :(得分:0)

我找到了解决方案。为了从命令中获得响应,我使用了以下代码:

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),它接受除了期望值以外的所有内容,因此将命令输出给了我。

相关问题