【问题标题】:How to filter output from a command in an Expect Script如何过滤期望脚本中命令的输出
【发布时间】:2019-07-22 19:10:34
【问题描述】:

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

这适用于 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

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

【问题讨论】:

  • 如果你使用ssh密钥认证,这可以像ssh -l user host './output.sh $(pgrep -fi java.*jboss)'一样简单
  • @glennjackman 不幸的是,我必须为每台服务器输入密码,这就是我使用 expect 的原因。

标签: bash tcl expect


【解决方案1】:

您的问题有两个方面:

  1. 在 sending 命令之后,您不是 expecting 响应。否则,当您尝试从响应中提取 ID 时,响应可能实际上不会被处理。
  2. expect_out(buffer) 变量可以很容易地包含您想要的文本以外的文本。您需要有选择性地进行匹配,例如,使用正则表达式和 -re 选项来“期望”。

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

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

当您无法弄清楚您的期望脚本出错的原因时,请记住打开调试模式。它通常准确地说明(直接)问题是什么,这非常有帮助……

【讨论】:

  • 另外,你是spawning ssh?你可能是(只是忘了在你的问题中写出来)或者这些都行不通……
  • 嘿,Donal,我正在生成 ssh。看起来脚本没有获取期望参数。我的目标是运行命令并从每个服务器获得不同的输出。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2017-06-11
    • 2012-10-23
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多