2011-09-09 4 views
0

Je suis en train d'écrire Expect script qui procédez comme suit ..Expect/TCL: passer des commandes aux ID proc/spawn spécifiques

ouvrent 13 fenêtres de terminal (gnome-terminal, xterm, etc) chaque fenêtre se connecte à un serveur terminal via ssh (ssh [email protected]) et est fourni le mot de passe via expect.

Je peux obtenir ce bon fonctionnement dans une seule fenêtre. le problème que je suis en train de faire est de passer l'entrée à chaque fenêtre.

par exemple ...

je peux faire

set timeout -1 

spawn gnome-terminal -x ssh [email protected] 

à l'intérieur d'une boucle while et obtenir mes 13 fenêtres. mais je voudrais que chacun soit connecté automatiquement via expect.

+0

Je ne pense pas que vous pouvez contrôler les applications X avec s'attendre. –

Répondre

1

Vous pouvez essayer une approche légèrement différente. Au lieu d'ouvrir les fenêtres de terminal dans le script expect, ouvrez-les dans un script shell de base et demandez à chaque terminal d'exécuter un script expect pour démarrer une seule session SSH.

Ainsi, le script expect pourrait être aussi simple que cela:

#!/usr/bin/expect -f 
spawn ssh [email protected] 
# ... provide password ... 
interact 

Et le script shell:

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

Lorsque vous engendrez, vous devez mettre en cache la valeur spawn_id de $ qui est fixé par la tentative.
par exemple.

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 

Pour envoyer une commande à une session de terminal en particulier, ne

send -i $stored_id "command"

Ensuite, avant de contacter chacun, vous devez d'abord faire

expect { 
-i $stored_id 

[... vos regex, globs, etc ...]
}

Vous pouvez trouver quelques informations add'l http://wiki.tcl.tk/11583

Je suggère également faire usage de la capacité de gnome-terminal pour spécifier plusieurs onglets, y compris une indication qui est celle qui est actuellement actif, et une commande à exécuter. gnome-terminal --help-all est utile (sans jeu de mots).

Questions connexes