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

how to pass shell variable into expect within shell script

谢谢。

我是新手,期待脚本。我试图将 "host" 变量值传递给 expect 但出现错误。我找不到如何处理这个问题。

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

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

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

b。另一种情况是,远程主机密钥不会出现在 know_hosts 文件中,那时当我们执行 ssh $host 时,它会提示输入密码:

正试图在 expect 的第二个正则表达式中处理

当我 运行 脚本时,出现错误提示:

**

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 }}]
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

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

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

首先,我强烈建议对环境变量使用全部大写的名称。环境名称中的小写字母可能会或可能不会起作用,具体取决于具体情况。

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

$::env(FOO)
[set ::env(FOO)]

顺便说一句,像你这样的情况,你不需要 double-colon;例如 $env(FOO) 会做同样的事情。但是,如果您习惯于编写 ::,以防万一您必须维护更复杂的 expect 程序,您将处于安全的一面。