Problema
Cuando se ejecuta apt-get install
en una sesión SSH no interactiva, la sesión nunca se cierra. Ejemplo:
ssh user@target "sudo apt-get -y install my_package"
Se my_package
instala correctamente, pero la sesión SSH simplemente se abre.
Pregunta
¿Hay alguna bandera para pasar SSH para ir apt-get
a trabajar?
Información Adicional
Contexto
La instalación remota se utiliza para la implementación automatizada de un paquete en un servidor de integración. Tan pronto como enviamos algunos cambios de código a un repositorio, un trabajo extrae el código, construye el paquete y lo implementa en la integración para verificar que todo funcione bien (en lo que respecta a la implementación).
Ya probado y notas
- La misma sesión de ejecución de SSH se
apt-get update
cierra limpiamente. Tenga en cuenta queapt-get update
no es interactivo, mientras queapt-get install
es. Esto puede sugerir que la interactividad es un problema. - Un comando como
ssh user@target "sudo apt-get install my_package && echo Hello"
nunca llega aecho
. debconf
se queja de que no puede encontrar una interfaz agradable (Display, Readline) y recurre a Teletype (aunque Readline está disponible).- En relación con la interfaz de debconf, pasar
-t
a forzar TTY con SSH no ayuda. NingunoDEBIAN_FRONTEND=noninteractive
. - Todo se hizo en Ubuntu 12_04 LTS.
ssh user@target
, los comandos del shell) ¿funciona correctamente?Respuestas:
La siguiente respuesta en SF hizo el truco:
ssh no puede ejecutar el comando remoto cuando se ejecuta desde el script cron bash
La
-t
bandera fuerza una asignación de pseudo-tty, excepto quizás cuando no hay TTY localmente. Pero pasar la bandera dos veces como en-t -t
solo pretende hacerlo. Y eso resolvió el problema.Consulte la documentación de SSH:
Ahora, ¿por qué funcionó eso? Resulta que
debconf
ya no se queja del frontend en los registros. Por lo tanto, creo que los-t
conjuntos dobles (¿atrae?) Segúndebconf
sea necesario, lo que permiteapt-get install
completar la sesión SSH limpiamente.fuente
Mientras lo miraba, esto puede hacer el trabajo. Llamar a cualquier comando debe ser seguido por exit y heredoc. Encontré la solución, pero no la he probado personalmente.
La respuesta original viene de aquí: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection
fuente
ssh user@host free -m
en mi entorno objetivo y funciona de maravilla. Voy a probar la recomendación a continuación.Bajo debian / jessie tuve éxito con este comando:
Pero quizás debería considerar usar ansible para esta y otras tareas futuras http://docs.ansible.com/ansible/apt_module.html
fuente