reiniciar múltiples máquinas de forma remota

11

Necesito reiniciar varias máquinas de forma remota. Normalmente solo publico

for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done

Pero quiero darles a los usuarios algo de tiempo antes del reinicio. Sin embargo, la sesión ssh no se desconectará incluso si uso:

ssh -f 'sudo shutdown -r +5 &;disown'

Recibo un mensaje de error:

bash: -c: línea 0: error de sintaxis cerca del token inesperado ;' bash: -c: line 0:sudo shutdown -r +5 &; disown '

¿Alguna sugerencia?

Horacio
fuente
1
Debo agregar que estoy tratando de enviar el comando de apagado a segundo plano con el "&". Si el intérprete de comandos interpreta el "&" como un separador de comandos, no sé cómo enviarlo a segundo plano para que funcione el comando "renegar".
Horace
El &personaje envía el comando en el lado izquierdo en el fondo. Así es como difiere de ;.
kasperd

Respuestas:

31

Como lo indica el mensaje de error, tiene un error de sintaxis en su comando. Se debe al hecho ligeramente sorprendente de que &no es parte de un comando de shell sino más bien un separador entre comandos (como ;es). Aunque ambos son separadores de comandos, &tiene un efecto adicional sobre el comando en su lado izquierdo. Esto ciertamente también me confunde a veces, y frecuentemente cometo el mismo error. Una vez que lo sabes, es fácil de arreglar.

La solución es no escribir, &;sino simplemente escribir uno de los dos separadores dependiendo de su intención. (Y en la mayoría de los casos en los que uno ha escrito, &;la intención era solo escribir &).

Esto debería funcionar:

ssh server 'sudo shutdown -r +5 & disown'
kasperd
fuente
77
Ganaste el premio de hoy por enseñarme algo que no sabía después de 25 años de atacar UNIX. También +1!
MadHatter
¿Qué pasa si tenía la intención de correr sudo shutdown -r +5 &en segundo plano y luego correr disown? ¿Cómo manejaría bash tal situación? Esperaría que esta sea la sintaxis perfecta para un comando, incluso teniendo &;. Si ;es un separador de comandos, entonces tiene 2 comandos en sus manos. ¿Derecho?
Ismael Miguel
1
@IsmaelMiguel No entiendo tu pregunta. El uso &iniciará el primer comando en segundo plano y una vez que se haya iniciado el primer comando, el segundo comando se ejecutará en primer plano.
kasperd
Quise decir que sudo shutdown -r +5 &; disownno parece una mala sintaxis. Quiero decir, mi intención podría ser ejecutar la primera parte en segundo plano y luego la segunda parte.
Ismael Miguel
@IsmaelMiguel El analizador de comandos probablemente podría extenderse para considerar que la cadena vacía es un comando válido que siempre tiene éxito. En ese caso sudo shutdown -r +5 &; disownse considerarían tres comandos válidos separados por &y ;. Sin embargo, significaría que hay que tener cuidado de no usar un separador adicional si se va a utilizar el estado existente del comando anterior. Lo que significa es que uno tiene que prestar atención a tokenizar, así ya que, por ejemplo, &&y & &consigue tokenizados diferente.
kasperd