La sesión SSH nunca se cierra al ejecutar "apt-get install"

14

Problema

Cuando se ejecuta apt-get installen 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_packageinstala correctamente, pero la sesión SSH simplemente se abre.

Pregunta

¿Hay alguna bandera para pasar SSH para ir apt-geta 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 updatecierra limpiamente. Tenga en cuenta que apt-get updateno es interactivo, mientras que apt-get installes. 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 a echo.
  • 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 -ta forzar TTY con SSH no ayuda. Ninguno DEBIAN_FRONTEND=noninteractive.
  • Todo se hizo en Ubuntu 12_04 LTS.
Eric Platon
fuente
Si ejecuta el comando de instalación manualmente (es decir ssh user@target, los comandos del shell) ¿funciona correctamente?
Anillo Ø
El comando de instalación simplemente funciona bien cuando se hace manualmente (lo que lleva a pensar que hay un problema con los tipos de sesión interactivos y sin inicio de sesión).
Eric Platon

Respuestas:

6

La siguiente respuesta en SF hizo el truco:

ssh no puede ejecutar el comando remoto cuando se ejecuta desde el script cron bash

La -tbandera fuerza una asignación de pseudo-tty, excepto quizás cuando no hay TTY localmente. Pero pasar la bandera dos veces como en -t -tsolo pretende hacerlo. Y eso resolvió el problema.

Consulte la documentación de SSH:

-t Fuerza la asignación de pseudo-tty. Esto se puede usar para ejecutar programas arbitrarios basados ​​en pantalla en una máquina remota, lo que puede ser muy útil, por ejemplo, al implementar servicios de menú. Varias opciones -t fuerzan la asignación de tty, incluso si ssh no tiene tty local.

Ahora, ¿por qué funcionó eso? Resulta que debconfya no se queja del frontend en los registros. Por lo tanto, creo que los -tconjuntos dobles (¿atrae?) Según debconfsea ​​necesario, lo que permite apt-get installcompletar la sesión SSH limpiamente.

Eric Platon
fuente
Creo que esta es una buena respuesta, pero no la marcaré de inmediato tal como está. Primero porque respondí yo mismo, y segundo, podría haber respuestas mejores / más genéricas. De vuelta a esto en el futuro.
Eric Platon
1

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.

ssh user@myremotemachine <<-EOF
free -m
exit
EOF

La respuesta original viene de aquí: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection

koressak
fuente
Gracias koressak. Supongo que esto depende del shell y la distribución del sistema operativo. Acabo de intentarlo ssh user@host free -men mi entorno objetivo y funciona de maravilla. Voy a probar la recomendación a continuación.
Eric Platon
Acabo de intentar una carrera completa con el enfoque heredoc. Eso no resolvió el problema. La sesión SSH se bloquea de la misma manera que se presenta en la pregunta. Gracias de nuevo por la respuesta y el puntero!
Eric Platon
1

Bajo debian / jessie tuve éxito con este comando:

ssh user@host "TERM=READLINE sudo apt-get install --reinstall less && echo done"

Pero quizás debería considerar usar ansible para esta y otras tareas futuras http://docs.ansible.com/ansible/apt_module.html

ThorstenS
fuente
Interesante, buena idea. En cuanto a Ansible, tal vez ahora. No sé cuándo surgió la pregunta. De todos modos, creo que es bueno saber "qué está sucediendo dentro" (c).
Eric Platon