2010-07-12 25 views
3

* Veuillez ne pas utiliser les touches SSH. Si ça te dérange, c'est comme ça que je le fais, fais comme si j'essayais de le faire à la place. :-) *Utilisation Attendez-vous à administrer des machines via SSH, mais pas toutes les tâches

J'utilise un script expect pour exécuter des commandes de routine sur un ensemble de serveurs sous mon contrôle via ssh. Le script doit exécuter un ensemble de commandes (par exemple, svn update ~/folderx \ r ") sur chacune des machines Mon script actuel fait tout ce que je veux qu'il fasse ... Parfois, il quitte la connexion ssh avant d'en terminer une des dernières commandes

Toute réflexion sur la façon dont je peux faire la connexion rester jusqu'à ce que toutes les commandes sont terminées Le code ci-dessous se connecte avec succès, exécute avec succès les deux premières commandes (ap-get mise à jour et un des mises à jour svn) et puis se déconnecte.

#!/usr/bin/expect -f 

spawn ssh [email protected] 
set timeout -1 
expect "Are you sure you want to continue connecting" {send "yes\r"; exp_continue} "password:" {send "*******\r"; exp_continue 
    } "[email protected]" {send "sudo apt-get update\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo svn update ~/folder1\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo svn update ~/folder2\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo svn update ~/folder3\r"} 
expect "password" {send "*******\r"; exp_continue} "[email protected]" {send "sudo reboot\r"} 
close 
+1

ne pas oublier le retour chariot après 'envoyer 'oui'' –

Répondre

2

Il se trouve que la raison pour laquelle il se terminait précédemment était que le modèle d'invite que je recherchais correspondait non seulement à l'invite, mais aussi à certaines sorties des commandes svn que j'exécutais. Je faisais correspondre seulement avec la partie "nom d'utilisateur" du modèle d'invite (le formulaire d'invite était "username @ machine: ~ $"). Une fois que j'ai modifié le script pour correspondre seulement "nom d'utilisateur @" il a commencé à fonctionner comme prévu.

p.s. le script ssh qui lie les liens ci-dessus fonctionne très bien.

3

l'utilisation Attendez-vous est généralement la mauvaise façon de faire ce genre de chose. la bonne façon est de mettre en place des clés ssh afin que vous puissiez ssh et exécuter des commandes sur e e machine distante sans fournir de mot de passe. Voilà comment faire:

0. Create public/private key pair on local machine. 
    (Only needs to be done once on local machine for all remote machines.) 
    Go to the ~/.ssh directory on your local machine and do this: 
    % ssh-keygen -t rsa 
1. Copy the public key to the remote machine: 
    % scp ~/.ssh/id_rsa.pub [email protected]:. 
2. Append that key to the authorized_keys file on the remote machine: 
    % ssh [email protected] 'cat id_rsa.pub >> .ssh/authorized_keys; /bin/rm id_rsa.pub' 
3. Finally, in case it doesn't work, check permissions, which must be just so: 
    (or maybe it's just that they can't be group/world writeable) 
    % cd ~; ls -ld . .ssh .ssh/authorized_keys 
    drwxr-xr-x . 
    drwxr-xr-x .ssh 
    -rw-r--r-- .ssh/authorized_keys 

est ici un script qui fait ci-dessus d'un seul coup:

http://jakehofman.com/code/sshkey

Vous pouvez alors exécuter des commandes sur la machine distante comme ceci:

ssh [email protected] ./foo args 

Pour exécuter des commandes sur la machine distante avec sudo, cependant, cela peut être une autre histoire. J'espère que d'autres pourront en parler. Mais dans un premier temps vous devriez éviter de vous attendre à la connexion initiale.

+0

Dang. J'ai oublié d'inclure dans ma question initiale le préemptif "s'il vous plaît ne me dites pas d'utiliser simplement les touches SSH". :-) – vlasits

+0

Ha, pas de problème. Mais maintenant je suis curieux, pourquoi ne pas utiliser les clés ssh au moins pour la connexion initiale? – dreeves

+0

Aucune raison du tout. En fait, étant donné cela, j'aurais probablement dû omettre le mot de passe initial/les lignes de connexion dans mon extrait puisque ce n'est pas vraiment là où le problème se produit. Dans l'intérêt de l'honnêteté, j'admettrai que je ne l'ai pas testé en utilisant des clés, mais je suis presque sûr que le problème que je vais persister même si je le faisais. D'accord ... vous m'avez persuadé ... Je vais essayer en utilisant les touches. – vlasits