comando ssh con comillas

11

Tengo un error extraño de que no he podido encontrar nada al respecto. Quería cambiar el comentario del usuario con el siguiente comando.

$ sudo usermod -c "New Comment" user

Esto funcionará mientras esté conectado a un servidor, pero quiero automatizarlo en más de 20 servidores. Por lo general, puedo usar una lista y recorrer los servidores y ejecutar un comando, pero en este caso obtengo un error.

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

Cuando ejecuto este bucle, arroja un error como si estuviera usando el comando incorrectamente pero se ejecutará bien en un solo servidor.

Mirando a través de las páginas man ssh Yo probé -ty -t -tbanderas pero los que no ha funcionado.

Lo he utilizado con éxito perl -p -i -een un bucle similar para editar archivos.

¿Alguien sabe una razón por la que no puedo repetir esto?

Piceas
fuente

Respuestas:

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
Mel
fuente
14

SSH ejecuta el comando remoto en un shell. Pasa una cadena al shell remoto, no una lista de argumentos. Los argumentos que pasa a los sshcomandos se concatenan con espacios intermedios. Los argumentos a sshson sudo, usermod, -c, New Commenty user, por lo que el shell remoto ve el comando

sudo usermod -c New Comment user

usermodse analiza Commentcomo el nombre del usuario y usercomo un parámetro extra falso.

Debe pasar las comillas al shell remoto para que el comentario se trate como una cadena. La forma más simple es poner todo el comando remoto entre comillas simples. Si necesita una comilla simple en ese comando, use '\''.

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

En lugar de llamar sshen un bucle e ignorar errores, use una herramienta diseñada para ejecutar comandos en múltiples servidores como pssh, mussh, clusterssh, etc. Consulte Ejecutar comandos automáticamente a través de SSH en muchos servidores

Gilles 'SO- deja de ser malvado'
fuente