【问题标题】:Expect within bash script期望在 bash 脚本中
【发布时间】:2017-02-20 19:53:36
【问题描述】:

我正在尝试将期望脚本实现为 bash 脚本。请耐心等待,因为我对 bash/expect 还很陌生。

这是按预期工作的期望脚本:

log_user 0

file delete foo.txt

set fh [open foo.txt a]

set servers {xxx@server1 xxx@server2}

foreach s $servers {
spawn ssh $s
expect "password: "
send "PASSWORD\r"
expect "$ "
send "grep "something" /some/log/file.log"
expect "$ " { puts $fh "$expect_out(buffer)"}
send "exit\r"
}

close $fh

现在,我希望将这个期望脚本包含在 bash 脚本中,但它没有按预期工作。

这是我目前所拥有的:

#!/bin/bash

XYZ=$(expect -c "
file delete foo.txt

set fh [open foo.txt a]

set servers {xxx@server1 xxx@server2}

foreach s $servers {
spawn ssh $s
expect "password: "
send "PASSWORD\r"
expect "$ "
send "grep "something" /some/log/file.log"
expect "$ " { puts $fh "$expect_out(buffer)"}
send "exit\r"
}

close $fh
")

echo "$XYZ"

我得到的错误是:

command substitution: line 42: syntax error near unexpected token `('
command substitution: line 42: `expect "$ " { puts $fh "$expect_out(buffer)"}'

我愿意接受任何其他方式来实现这一点! :)

【问题讨论】:

  • 在您的原始脚本中,变量$servers 被Tcl 扩展,因为整个东西都是一个Tcl 程序。在您的第二个脚本中,变量 $server 由 bash 扩展,并且由于没有具有此名称的 bash 变量,因此将其替换为空字符串。

标签: bash shell expect


【解决方案1】:

您可以使用/usr/bin/expect -c 执行expect 命令:

#!/bin/bash

/usr/bin/expect -c ' 

file delete foo.txt

set fh [open foo.txt a]

set servers {xxx@server1 xxx@server2}

foreach s $servers {
spawn ssh $s
expect "password: "
send "PASSWORD\r"
expect "$ "
send "grep "something" /some/log/file.log"
expect "$ " { puts $fh "$expect_out(buffer)"}
send "exit\r"
}

close $fh
'

【讨论】:

  • 太好了,这正是我想要的。谢谢!
  • 有没有办法使用这种方法将变量传递给期望代码?
【解决方案2】:

Bertrand 的回答是解决您的问题的一种方法,但并未解释您所做的问题。

Bash 尝试在双引号字符串中展开变量,因此您的 expect 脚本将在您希望看到 $servers$s$fh 的位置看到空格。此外,您还有三重嵌套的双引号字符串集,这将导致解析expect 的参数时出现各种问题。

这是一个见仁见智的问题,但我认为当某些东西达到某个程度,它被认为是它自己的程序时,它应该被分离到一个单独的文件中。

#!/usr/bin/expect
log_user 0

file delete foo.txt

set fh [open foo.txt a]

set servers {xxx@server1 xxx@server2}

foreach s $servers {
    spawn ssh $s
    expect "password: "
    send "PASSWORD\r"
    expect "$ "
    send "grep 'something' /some/log/file.log"
    expect "$ " {
        puts $fh "$expect_out(buffer)"
    }
    send "exit\r"
}

close $fh

确保它是可执行的,然后从您的bash 脚​​本中调用它:

#!/bin/bash
/usr/local/bin/my_expect_script

(要真正正确地做到这一点,您应该设置公钥身份验证,然后您可以通过直接从 bash 运行 ssh server "grep 'something' /some/log/file.log" 来完全摆脱期望)

【讨论】:

  • 另外,在 expect 脚本中进行的日志记录可以在 bash 方面更简洁地完成。
猜你喜欢
  • 2016-02-28
  • 2014-09-20
  • 2014-08-11
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2016-09-06
  • 1970-01-01
相关资源
最近更新 更多