comando ssh con virgolette


11

Ho uno strano errore che non sono stato in grado di trovare nulla al riguardo. Volevo cambiare il commento dell'utente con il seguente comando.

$ sudo usermod -c "New Comment" user

Funzionerà quando si accede a un server ma voglio automatizzarlo su oltre 20 server. Di solito sono in grado di utilizzare un elenco e scorrere i server ed eseguire un comando, ma in questo caso viene visualizzato un errore.

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

Quando eseguo questo ciclo, viene restituito un errore come se stessi usando il comando in modo errato, ma funzionerà perfettamente su un singolo server.

Guardando attraverso le pagine man di ssh ho provato -te le -t -tbandiere ma quelle non hanno funzionato.

Ho usato con successo perl -p -i -eall'interno di un ciclo simile per modificare i file.

Qualcuno sa un motivo per cui non sono in grado di eseguire questo ciclo?

Risposte:


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

o

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

14

SSH esegue il comando remoto in una shell. Passa una stringa alla shell remota, non un elenco di argomenti. Gli argomenti passati ai sshcomandi vengono concatenati con spazi in mezzo. Gli argomenti sshsono sudo, usermod, -c, New Commente user, quindi la shell remota vede il comando

sudo usermod -c New Comment user

usermodanalizza Commentcome il nome dell'utente e usercome parametro extra spurio.

È necessario passare le virgolette alla shell remota in modo che il commento sia trattato come una stringa. Il modo più semplice è mettere l'intero comando remoto tra virgolette singole. Se hai bisogno di una sola citazione in quel comando, usa '\''.

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

Invece di chiamare sshin un ciclo e ignorare gli errori, utilizzare uno strumento progettato per eseguire comandi su più server come pssh, mussh, clusterssh, ecc. Vedere Esecuzione automatica dei comandi su SSH su molti server

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.