2010-07-07 7 views
0

J'essaie de transmettre les informations de connexion à différentes machines via ssh dans un script shell. Même si j'ai utilisé une boucle for, je finis par envoyer toutes les informations de connexion à toutes les machines. Quelqu'un pourrait m'aider avec ça?Arguments de ssh en boucle

for system in ${allSystems} 
    do 
     machine=`echo $system | awk -F ";" '{print $1}'` 
     username=`echo $system | awk -F ";" '{print $2}'` 
     password=`echo $system | awk -F ";" '{print $3}'` 

     echo "$machine;$username;$password" | ssh $machine 'cat >> loginDetails.txt'  
    done 

Un exemple de système $ contiendrait:

abcde.unix.system.edu;username;password 

Merci.

+0

Que signifie '$ allSystems' ressembler? Pourquoi analysez-vous votre nom d'utilisateur et votre mot de passe lorsque vous n'en avez pas besoin? –

Répondre

2

Serait-il plus logique de configurer ssh authorised_keys sur le serveur distant? De cette façon, vos scripts n'auront pas à entrer de mot de passe.

En supposant que votre machine distante est nommé remote_machine:

Sur votre machine locale:

scp ~/.ssh/id_rsa.pub remote_machine:~/.ssh/source.pub 

Ces étapes ont lieu sur la machine distante:

ssh remote_machine 
cd .ssh 
if [ -e "authorized_keys" ]; then 
    cat source.pub >> authorized_keys 
else 
    mv source.pub authorized_keys 
fi 

Si vous êtes coincé, suivez les instructions dans ce HOWTO. Assurez-vous de bien comprendre ce que vous faites avant d'exécuter du code sur n'importe quelle machine de production. Cela permettra à quiconque avec votre login sur votre boîte d'accéder à la remote_machine.

+0

Merci pour votre réponse. J'ai déjà installé ssh.J'ai encore besoin d'envoyer toutes ces informations car mon script en a besoin sur le serveur cible. – Nithin

0

Votre boucle semble essayer d'ajouter les informations de connexion pour chaque machine à un fichier distant sur la même machine. Êtes-vous sûr de vouloir l'ajouter? Peut-être votre boucle ne fait rien, et les fichiers existent déjà?

Déboguer en supprimant ssh de la question. Remplacer la ligne commençant par « echo » avec ceci:

echo "$system => machine:$machine username:$username password:$password" 

et vérifiez que chacune des variables système $, machine $, $ username et mot de passe $ est comme prévu. BTW, un moyen plus efficace d'écrire cela pourrait être d'utiliser awk, ou sed, ou même tr (selon le format de votre liste de systèmes) pour extraire les trois champs, puis utiliser un shell tout en -read boucle pour itérer sur eux, évitant ainsi trois invocations de 'awk' par hôte accédé. Par exemple, si "allsystems de $" contient

mach1;user1;pass1 mach2;user2;pass2 mach3;user3;pass3 

sans champs étrangers ou d'autres informations indésirables, vous pouvez utiliser ceci:

echo "$allsystems" | tr '; ' '\t\n' | while read mach user pass 
    do 
     echo ... 
    done