如何在shell脚本中将shell变量传递给expect

时间:2017-02-19 17:20:29

标签: shell expect

感谢。

我是新手,期待脚本。我试图将“主机”变量值传递给期望但却出错。我无法找到如何处理这个问题。

我获取主机名值并保存名为“host”的变量,然后使用expect执行ssh $ host。

一个。一些远程主机的密钥已经存在于know_hosts文件中,所以当我们执行ssh $ host时,我们直接得到提示(#)

我试图在第一个正则表达式行中处理这个问题

湾其他情况是,远程主机密钥不会出现在know_hosts文件中,当我们执行ssh $ host时,它会得到提示要求输入密码:

我试图在第二个正则表达式中处理期待

当我运行脚本时,收到错误说:

**

can't read "host": no such variable
    while executing
"set cmd ssh $host"

**

bash脚本:

    #!/usr/bin/bash

    host=`echo $REMOTE_HOSTNAME`
    export host

# logic to add remote hosts key into know_hosts file (didn't paste it here)

    output=$(expect -c '
    set prompt "(%|#|-|:|\\$) $"
    #gets stdin host; <<<"$host"
    puts $::env(host)
    set cmd ssh $host
    send -- "$cmd\r"

    set outcome ""
    regexp {^[.*#$} ignore outcome
    send -- "ls -la\r"
    expect -re $prompt
    send -- "exit\r"

    set results $expect_out(buffer)
    regexp {^root.*:$} $expect_out(buffer) results] } {
            send -- "pwd\r"
            expect -re $prompt
            send -- "date\r"
            send -- "exit\r"
    }
    ')

任何帮助都非常感激。

==========================================

更新:

==========================================

我能够解决主变量问题,想通了我需要为主变量提供单引号。

但现在得到2行输出,即

打印主机名的第一行 第二行应用程序活动号码以及主机名

如何才能将应用有效号码作为输出?

工作脚本:

        #!/usr/bin/bash

        host=`echo $REMOTE_HOSTNAME`
        export host

    # logic to add remote hosts key into know_hosts file (didn't paste it here)

output=$(expect -c '
#exp_internal 1
match_max 5000
set prompt "(%|#|-|:|\\$) $"
puts $::env(host)
send -- "ssh '$host'\r"
set cmd [exec appmon -print Streams active | grep -v Error | grep -Ev "^$"  | awk -F {:} {{print $2}}]
send -- "$cmd\r"
set outcome ""
regexp {#$} ignore outcome
expect *
puts $expect_out(buffer)
#set results [lindex [split $expect_out(buffer) \n] 3]
regexp {^root.*:$} $expect_out(buffer) results] } {
        send -- "pw\r"
        expect -re $prompt
        send -- "date\r"
        send -- "exit\r"
}
set out  [lindex [split $expect_out(buffer) \n] 1]
puts $out
')
echo "======="
echo "$output"
echo "======="

输出获取:

======= cvxe-abdhe01

14272e-abdhe01

我期待只看到

14274

1 个答案:

答案 0 :(得分:1)

小心你在说什么。我们有 shell变量,我们有导出的shell变量 a.k.a. 环境变量。在您的代码中,您有一个环境变量,因为您导出它。

因此我在这里回答了从 expect 程序中访问环境变量的问题。如果你真的关心shell变量,请在你的帖子中说明这一点。

首先,我强烈建议对环境变量使用ALL UPPERCASE名称。根据具体情况,在环境名称中使用小写字母可能会也可能不起作用。

现在假设我有一个环境变量FOO,我想在 expect 中访问它。这可以通过两种方式完成,使用内置数组env

$::env(FOO)
[set ::env(FOO)]
顺便说一下,在像你这样的情况下,你不需要双结肠;例如$env(FOO)也会这样做。但是,如果您习惯于编写::,那么您将保持安全,以防您需要维护更复杂的 expect 程序。