如何在 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 程序,您将处于安全的一面。
谢谢。
我是新手,期待脚本。我试图将 "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 程序,您将处于安全的一面。