感谢。
我是新手,期待脚本。我试图将“主机”变量值传递给期望但却出错。我无法找到如何处理这个问题。
我获取主机名值并保存名为“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
我期待只看到
14274
答案 0 :(得分:1)
小心你在说什么。我们有 shell变量,我们有导出的shell变量 a.k.a. 环境变量。在您的代码中,您有一个环境变量,因为您导出它。
因此我在这里回答了从 expect 程序中访问环境变量的问题。如果你真的关心shell变量,请在你的帖子中说明这一点。
首先,我强烈建议对环境变量使用ALL UPPERCASE名称。根据具体情况,在环境名称中使用小写字母可能会也可能不起作用。
现在假设我有一个环境变量FOO,我想在 expect 中访问它。这可以通过两种方式完成,使用内置数组env
:
$::env(FOO)
[set ::env(FOO)]
顺便说一下,在像你这样的情况下,你不需要双结肠;例如$env(FOO)
也会这样做。但是,如果您习惯于编写::
,那么您将保持安全,以防您需要维护更复杂的 expect 程序。