commande ssh avec guillemets

11

J'ai une étrange erreur que je n'ai pas pu trouver quoi que ce soit à ce sujet. Je voulais changer le commentaire de l'utilisateur avec la commande suivante.

$ sudo usermod -c "New Comment" user

Cela fonctionnera lorsque vous serez connecté à un serveur, mais je souhaite l'automatiser sur plus de 20 serveurs. Habituellement, je peux utiliser une liste et parcourir les serveurs et exécuter une commande, mais dans ce cas, j'obtiens une erreur.

$ for i in `cat servlist` ; do echo $i ; ssh $i sudo usermod -c "New Comment" user ; done 
serv1
Usage: usermod [options] LOGIN

Options:
lists usermod options

serv2
Usage: usermod [options] LOGIN

Options:
lists usermod options
.
.
.

Lorsque j'exécute cette boucle, il renvoie une erreur comme si j'utilise la commande incorrectement, mais elle fonctionnera très bien sur un seul serveur.

En regardant à travers les pages de manuel ssh j'ai essayé -tet des -t -tdrapeaux , mais ceux ne fonctionnait pas.

J'ai utilisé avec succès perl -p -i -edans une boucle similaire pour modifier des fichiers.

Est-ce que quelqu'un connaît une raison pour laquelle je ne peux pas boucler cela?

SpruceTips
la source

Réponses:

6
for i in `cat servlist`;do echo $i;ssh $i 'sudo usermod -c "New Comment" user';done

ou

for i in `cat servlist`;do echo $i;ssh $i "sudo usermod -c \"New Comment\" user";done
Mel
la source
14

SSH exécute la commande à distance dans un shell. Il transmet une chaîne au shell distant, pas une liste d'arguments. Les arguments que vous passez aux sshcommandes sont concaténés avec des espaces entre les deux. Les arguments sshsont sudo, usermod, -c, New Commentet user, de sorte que le shell distant voit la commande

sudo usermod -c New Comment user

usermodanalyse Commentle nom de l'utilisateur et userun faux paramètre supplémentaire.

Vous devez passer les guillemets au shell distant pour que le commentaire soit traité comme une chaîne. Le moyen le plus simple consiste à mettre la commande distante entière entre guillemets simples. Si vous avez besoin d'un seul devis dans cette commande, utilisez '\''.

ssh "$i" 'sudo usermod -c "Jack O'\''Brian" user'

Au lieu d'appeler sshdans une boucle et d'ignorer les erreurs, utilisez un outil conçu pour exécuter des commandes sur plusieurs serveurs tels que pssh, mussh, clusterssh, etc. Voir Exécuter automatiquement des commandes via SSH sur de nombreux serveurs

Gilles 'SO- arrête d'être méchant'
la source