期望 - 如何将$ expect_out(0,string)的输出设置为变量并进一步使用它

时间:2014-06-24 09:06:33

标签: expect

我对Expect完全不熟悉......我需要编写一个脚本,它将远程登录到MS服务器,在那里显示当前会话并注销特定用户。附上脚本。

#!/bin/bash

# execute expect part
/usr/bin/expect <<EOF
#
# telnet to PC
#
spawn telnet 9.9.9.9;
expect "login:";
send "admin\r";
expect "password:";
send "admin\r";
expect "*>";
send "Query session test\r";
expect -re " \[0-9] ";
set val [\$expect_out(0,string)];
send "logoff $val\r";
send "\r";
expect "*>";
send "\x1d";
expect "*>";
send "q\r";
exit 1;
EOF; 

我无法让它发挥作用。看来我在定义变量时做错了。当我运行脚本时,我得到以下结果:

C:\Users\admin>Query session test                                         
SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
rdp-tcp#0         test                      3  Active  rdpwd

C:\Users\admin>invalid command name " 3 "
while executing
"$expect_out(0,string)"
invoked from within
"set val [$expect_out(0,string)]"

当我在脚本中使用send_user时,我在telnet会话中得到了正确的输入,但是由于某种原因它根本不接受它作为命令。

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

Expect会将匹配括号之间的内容视为命令。

set val [\$expect_out(0,string)]表示执行名为 $ expect_out(0,string)的命令(在这种情况下,它是 3 。)并将命令输出分配给<强> VAL 即可。这就是输出显示invalid command name " 3 "的原因,因为没有这样的命令。

将行更改为set val $expect_out(0,string),我相信情况会好转。

BTW,send_user就像puts。它只将消息打印到标准输出,而不是生成的进程。