Script de actualización automática

Estoy tratando de actualizar las Mac en mi lugar de trabajo en un momento específico. Para hacerlo, estoy ejecutando un script bash desde una Macbook de repuesto que ejecuta OS X Server. Tengo un problema menor y otro mayor con mi script actual, y me vendría bien su ayuda.

El script es muy simple y no necesito que sea demasiado robusto para mis propósitos:

#!/bin/bash
for host in 192.blah.blah.blah 192.blah.blah.blah 192.blah.blah.blah
do
ssh -t $host sudo softwareupdate -ia
ssh -t $host sudo shutdown -r now
done

El problema menor: por alguna razón, si trato de poner ambos comandos en la misma línea usando ;o &&así:

ssh -t $host sudo softwareupdate -ia;sudo shutdown -r now

o

ssh -t $host sudo softwareupdate -ia && sudo shutdown -r now

en su lugar, reinicia el servidor real. No estoy seguro de dónde me estoy equivocando con la sintaxis.

El gran problema: a pesar de configurar ssh con una clave ssh pública (usando las instrucciones que encontré aquí ), todavía se me pide que ingrese una contraseña dos veces por máquina cuando se ejecuta el script. Estoy seguro de que se debe a nuestro amigo sudo, pero los comandos no se ejecutan en absoluto sin él. Idealmente, configuraré un trabajo cron a primera hora de la mañana y haré que ejecute este script automáticamente para que, cuando esté en el trabajo, las Mac se hayan actualizado y reiniciado. Estoy seguro de que hay una manera de hacerlo, pero mi Google-Fu me está fallando.

EDITAR/RESPUESTA PARCIAL Resulta que, incluso si pone TextEdit en modo Texto sin formato, sigue usando 'comillas tipográficas'. Escribir y guardar el script a través de la Terminal y LUEGO ejecutarlo funcionó de maravilla.

0942v8653 tuvo la amabilidad de ayudarme en el chat y también proporcionó un comando para desactivar esta 'función':defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false

Sigo buscando una solución al problema de la contraseña.

Respuestas (2)

Los ;y &&son interpretados por bashen la máquina local. Puede ver esto ejecutando ssh 127.0.0.1 -t env && env: la segunda vez, no habrá ninguna SSH_CONNECTIONvariable.

Puede citar el comando completo para que funcione correctamente:

ssh -t $host 'sudo softwareupdate -ia && sudo shutdown -r now'

En mi opinión, -tsolo debe permitir un argumento entre comillas para evitar problemas como este... También tenga cuidado con la expansión variable: asegúrese de poner todo entre comillas simples o escape con barras invertidas para evitar que se expanda o interprete en la máquina local.

Por extraño que parezca, cuando hago eso me sale el error 'sudo: command not found. Me desconcierta. Aunque, tal vez debería tener en cuenta: estoy ejecutando server.app en Yosemite. Dudo que esa sea la raíz del problema, pero pensé en mencionarlo.
¿Estás seguro de que tienes esa línea exacta?
Efectivamente. Eliminé el ciclo for temporalmente solo para resolver este script, por lo que mi código actual dicessh -t [username]@[ClientMacIP] 'sudo softwareupdate -ia && sudo shutdown -r now'
¿Puedes probarlo con un comando ficticio como echo? Esto es muy extraño…
Definitivamente es raro. Echo devuelve el mismo tipo de error 'echo command not found. Tengo que pensar que es la forma en que estoy llamando al script... He hecho cd en el directorio en el que está, y lo estoy llamando consudo ./UpdateScript.sh
No debería necesitar usar Sudo para ejecutar el script. ¿Ocurre algo diferente si solo ejecuta la línea desde el aviso?
Correcto, debería haber mencionado que lo probé hace un rato, y sí, el comando original ssh -t [username]@[ClientMacIP] 'sudo softwareupdate -ia && sudo shutdown -r now'funciona de maravilla si lo escribo todo en el aviso.

No estoy seguro del problema de reinicio, pero configurar un script para ejecutar sudocomandos sin ingresar la contraseña es bastante fácil. Eche un vistazo al Paso 4 de esta respuesta que escribí anteriormente (era para algo completamente diferente, pero los pasos para habilitar la ejecución sudosin contraseña son universales).

Tenga en cuenta que el comando real para ejecutar su secuencia de comandos cambiará a

sudo ./myscript.sh

Paso 4: configurar sudo para que se ejecute sin contraseña

Permitir que el comando Terminal sudose ejecute sin una contraseña puede ser muy peligroso. Es por eso que los pasos anteriores crearon los scripts de shell en su propio directorio, por lo que lo que realmente se puede ejecutar es limitado.

Ingrese el siguiente comando en la Terminal:

sudo pico /etc/sudoers

Luego ingrese su contraseña de administrador cuando se le solicite.

Esto puede llevarlo a una pantalla (en su mayoría) en blanco, o puede tener algo de texto. Si está en blanco, está bien. Simplemente pegará la línea de abajo en la parte superior. Si el texto ya existe, también está bien; use su flecha hacia abajo para ir justo debajo de las líneas que ya están en la # User privilege specificationsección, como se ve en la siguiente captura de pantalla.

Aquí, agregue la siguiente línea:

<yourusername> ALL = NOPASSWD: /Users/<yourusername>/PathToScript/*

En ambos lugares donde <yourusername>aparece, reemplácelo con su nombre de usuario de Mac. Presione control + x, escriba y y presione regresar para guardar y salir.

Lindo. Supongo que esto se debe hacer en el servidor, ¿sí? No los clientes.
Eso es correcto.
Hm. No reconoce el comando a menos que use sudo bash UpdateScript.sh. Además, cuando lo llamo así, termina pidiéndome una contraseña una y otra vez hasta que dice "Permiso denegado (clave pública, teclado interactivo)". ¿Pensamientos?
Cuando abro el archivo /etc/sudoers me dice "Este archivo DEBE ser editado con el comando 'visudo'". ¿Todavía crees que pico es seguro de usar?
@Fyrefly: establezca la VISUALvariable de entorno en pico.
¡Gracias, no para comenzar una guerra, pero trato de evitar vi siempre que sea posible!