Estoy automatizando un proceso de implementación y quiero poder simplemente llamar un archivo .sh en mi máquina, hacer que compile y cargue el .zip en el servidor y luego haga un montón de cosas en el servidor. Una de las cosas que necesito hacer requiere que sea root. Entonces, lo que quiero hacer es esto:
ssh user@172.1.1.101 <<END_SCRIPT
su -
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT
¿Es esto posible?
Respuestas:
¿Has considerado un sudo sin contraseña en su lugar?
fuente
En lugar de su, use sudo con el NOPASSWD establecido en sudoers para los comandos apropiados. Deberá hacer que el conjunto de comandos permitido sea lo más limitado posible. Hacer que ejecute un script para los comandos raíz puede ser la forma más limpia y, con mucho, más fácil de asegurar si no está familiarizado con la sintaxis del archivo sudoer. Para los comandos / scripts que requieren que se cargue el entorno completo,
sudo su - -c command
funciona aunque puede ser excesivo.fuente
Lo que estás describiendo podría ser posible con esperar .
fuente
Puede pasar un comando como argumento a SSH para ejecutar ese comando en el servidor y luego salir:
Esto también funciona para una lista de múltiples comandos:
O alternativamente:
Como otros usuarios han señalado antes que yo, ejecutar
su
en el servidor lanzará un nuevo shell en lugar de ejecutar comandos posteriores en el script como root. Lo que debe hacer es usar unosudo
osu -c
, y forzar la asignación de TTY a SSH con el-t
interruptor (requerido si necesita ingresar la contraseña de root):En resumen, una forma de lograr lo que quieres hacer sería:
Como
sudo
normalmente recuerda su nivel de autorización durante unos minutos antes de solicitar nuevamente la contraseña de root, simplemente anteponersudo
todos los comandos que necesita ejecutar como root es probablemente la forma más fácil de ejecutar comandos como root en el servidor. Agregar unaNOPASSWD
regla para su usuario/etc/sudoers
hará que el proceso sea aún más sencillo.Espero que esto ayude :-)
fuente
NOPASSWD
regla, consulte los ejemplos en la parte inferior deman sudoers
. Además, recuerde usarlovisudo
cuando edite susudoers
archivo para evitar roturas.su -c
lugar desudo
, debe ejecutar SSH con el-t
indicador; se le pedirá la contraseña de root en el servidor cuando se ejecute el comando. Proporcionar una contraseña directamentesu
como un argumento de línea de comandos es compatible ni (por lo que sé), ni recomendable - desde un simpleps -ef | grep su
revela todos los argumentos que se pasan asu
, incluyendo cualquier contraseña proporcionada desde la línea de comandos ...su -c
través de SSH:ssh -t user@host 'su -lc "
<br />echo this is a test
<br />echo this is another test
<br />"
<br />'
<br />
anterior con nuevas líneas en su secuencia de comandos. Fuera de tema: ¿Puede agregar nuevas líneas a los comentarios de ServerFault? Eso sería bastante útil al publicar fragmentos de código ...No. Incluso si obtiene la contraseña
su
, todavía tiene que lidiar con el hecho de quesu
abrirá un nuevo shell, lo que significa que no se le pasarán más comandos. Deberá escribir un script para las operaciones raíz junto con un ejecutable auxiliar que pueda invocarlo con los privilegios apropiados.fuente
Escribe un guión de esperar. Sé que ya ha encontrado una respuesta para esto, pero esto podría ser útil si tiene que iniciar sesión en un grupo de servidores que requieren la entrada de contraseña interactiva.
Es un lenguaje basado en TCL, por lo que puede ser un poco extraño en comparación con los viejos scripts de shell. Pero maneja la automatización del ingreso de texto y, lo adivinó, "espera" ciertos bits de salida antes de ingresar cualquier tipo de ingreso automático de contraseña o escalada de privilegios.
Aquí hay un buen enlace como guía: http://bash.cyberciti.biz/security/expect-ssh-login-script/
En caso de que el sitio se caiga:
fuente
Sé que esto es un poco tarde, pero personalmente usaría Net :: SSH :: Expect, disponible de CPAN.
http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod
fuente
Puede usar 'ssh example.com su -lc "$ cmd"'.
Cuando el comando contiene opciones, debe citarlo; de lo contrario, "su" podría comerlas ("su: opción no válida - 'A').
fuente