Expect / TCL: передавать команды на определенные идентификаторы proc / spawn - PullRequest
0 голосов
/ 10 сентября 2011

Я пытаюсь написать сценарий ожидания, который будет делать следующее ..

открыть 13 окон терминала (gnome-терминал, xterm и т. Д.) каждое окно подключается к терминальному серверу через ssh (ssh InReach@10.1.6.254) и предоставляется пароль через ожидаемый.

Я могу заставить это работать нормально в одном окне. проблема, с которой я сталкиваюсь, заключается в том, чтобы передать ввод каждому окну.

например ...

я могу сделать

set timeout -1

spawn gnome-terminal -x ssh InReach@10.1.6.254

внутри цикла while и получи мои 13 окон. но я бы хотел, чтобы каждый из них автоматически входил в систему с помощью ожидаемого.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Когда вы порождаетесь, вам необходимо кэшировать значение $ 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

[... ваши регулярные выражения, глобусы и т. Д. ...]}

Вы можете найти некоторую дополнительную информацию http://wiki.tcl.tk/11583

Я бы также предложил использовать возможность gnome-терминала для указания нескольких вкладок, включая указание того, какая в данный момент-активный и команда, которая будет выполнена.gnome-terminal --help-all полезно (каламбур не предназначен).

1 голос
/ 10 сентября 2011

Вы можете попробовать немного другой подход.Вместо того, чтобы открывать окна терминала в сценарии ожидаемого доступа, откройте их в базовом сценарии оболочки, и каждый терминал должен запустить ожидаемый сценарий для запуска одного сеанса SSH.

Таким образом, ожидаемый сценарий может быть таким простым, как этот:

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

И сценарий оболочки:

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