Expect / TCL:将命令传递给特定的proc / spawn ID

时间:2011-09-09 20:45:41

标签: tcl expect spawn

我正在尝试编写一个将执行以下操作的expect脚本。

打开13个终端窗口(gnome-terminal,xterm等) 每个窗口通过ssh(ssh InReach@10.1.6.254)连接到终端服务器 并通过expect提供密码。

我可以在一个窗口中正常工作。我遇到的问题是将输入传递给每个窗口。

例如

......

我能做到

set timeout -1

spawn gnome-terminal -x ssh InReach@10.1.6.254

在一个while循环中,得到我的13个窗口。但我希望每个人都能通过expect自动登录。

2 个答案:

答案 0 :(得分:1)

您可以尝试稍微不同的方法。不要在expect脚本中打开终端窗口,而是在基本的shell脚本中打开它们,让每个终端运行一个expect脚本来启动单个SSH会话。

所以期望脚本可以这么简单:

#!/usr/bin/expect -f
spawn ssh InReach@10.1.6.254
# ... provide password ...
interact

shell脚本:

#!/bin/sh
for a in `seq 1 13`; do
    gnome-terminal -x ./expect_script
done

答案 1 :(得分:1)

当你产生时,你需要缓存由尝试设置的$ spawn_id值 例如

if [catch "spawn ssh -l mtc $ub1_ip_address" ub1_pid] {
    Log $ERROR "Unable to spawn ssh to Xubuntu.\n$ub1_pid\n"
    return 0
}
set stored_id $spawn_id

要特别向一个终端会话发送命令,请执行

send -i $stored_id "command"

然后,在你联系每个人之前,你必须先做

 expect {
-i $stored_id

[...你的正则数据,整数等...]
}

你可以找到一些add'l info http://wiki.tcl.tk/11583

我还建议使用gnome-terminal指定多个选项卡的功能,包括指示哪个是当前活动的选项卡,以及要执行的命令。 gnome-terminal --help-all很有用(没有双关语)。