ssh Befehl mit Anführungszeichen

11

Ich habe einen seltsamen Fehler, dass ich nichts dazu finden konnte. Ich wollte den Benutzerkommentar mit dem folgenden Befehl ändern.

$ sudo usermod -c "New Comment" user

Dies funktioniert, wenn Sie an einem Server angemeldet sind, aber ich möchte es auf über 20 Servern automatisieren. Normalerweise kann ich eine Liste verwenden und die Server durchlaufen und einen Befehl ausführen, aber in diesem Fall wird eine Fehlermeldung angezeigt.

$ 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
.
.
.

Wenn ich diese Schleife ausführe, wird ein Fehler zurückgeworfen, als würde ich den Befehl falsch verwenden, aber er wird auf einem einzelnen Server einwandfrei ausgeführt.

Blick durch die SSH - man - Seiten habe ich versucht -tund -t -tFahnen aber die haben nicht funktioniert.

Ich habe erfolgreich perl -p -i -ein einer ähnlichen Schleife Dateien bearbeitet.

Kennt jemand einen Grund, warum ich dies nicht wiederholen kann?

Fichtentipps
quelle

Antworten:

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

oder

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

SSH führt den Remote-Befehl in einer Shell aus. Es übergibt eine Zeichenfolge an die Remote-Shell, keine Liste von Argumenten. Die Argumente, die Sie an die sshBefehle übergeben, werden mit Leerzeichen dazwischen verknüpft. Die Argumente sshsind sudo, usermod, -c, New Commentund user, so dass der Remote Shell sieht den Befehl

sudo usermod -c New Comment user

usermodWird Commentals Name des Benutzers und userals falscher zusätzlicher Parameter analysiert .

Sie müssen die Anführungszeichen an die Remote-Shell übergeben, damit der Kommentar als Zeichenfolge behandelt wird. Am einfachsten ist es, den gesamten Remote-Befehl in einfache Anführungszeichen zu setzen. Wenn Sie in diesem Befehl ein einfaches Anführungszeichen benötigen, verwenden Sie '\''.

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

sshVerwenden Sie ein Tool zum Ausführen von Befehlen auf mehreren Servern wie pssh, mussh, clusterssh usw., anstatt eine Schleife aufzurufen und Fehler zu ignorieren. Siehe Automatisches Ausführen von Befehlen über SSH auf vielen Servern

Gilles 'SO - hör auf böse zu sein'
quelle