Parece que tengo una pequeña discrepancia entre el comportamiento de ssh-agent para dos cuentas que he configurado.
Escribí un script de monitoreo simple para verificar la disponibilidad de algunas máquinas virtuales que tenemos en ejecución. Hice todas las pruebas y depuraciones con mi cuenta de acceso principal. En el proceso, generé un par de claves SSH, inicié ssh-agent y agregué la identidad al agente para permitir que el script usara ssh sin necesidad de una contraseña.
Ahora, me gustaría ejecutar este script como usuario de una cuenta de servicio. Creé la cuenta de servicio y, para generar las claves, configuré temporalmente el shell de inicio de sesión en /bin/bash. Generé mis claves, eliminé la frase de contraseña y agregué la identidad al agente.
La discrepancia parece estar en la forma en que el shell se conecta con el agente. En mi cuenta de usuario, no he tenido que reiniciar el agente desde que comencé a realizar las pruebas (aproximadamente dos semanas). Pero, cuando intento ejecutar el script con la cuenta de servicio, parece que tengo que reiniciar el agente cada vez, agregar la identidad y luego realizar el trabajo.
Idealmente, me gustaría que el agente se ejecute indefinidamente y que la cuenta de servicio se vuelva a conectar automáticamente cada vez que se ejecute el script, para no tener que administrar procesos dentro del script. He mirado las configuraciones de cada cuenta y no encuentro diferencias. Cualquier idea sería muy apreciada.
**Editar: Olvidé señalar que el agente se ejecuta continuamente, pero los procesos de shell para la cuenta de servicio no parecen estar utilizándolo y es necesario iniciar uno nuevo:
ovmmon 14043 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
ovmmon 14952 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
Respuesta1
Una de dos cosas está sucediendo aquí:
- El agente ssh en realidad se cierra cuando cierras la sesión
- El agente ssh todavía se está ejecutando, pero estás perdiendo la información sobre su PID y su canalización.
Puede verificar cuál es el caso haciendo ps -ef y verificando si hay ssh-agent.
Si el agente ssh está muerto, necesita una forma de mantenerlo vivo. Aquí hay tres formas de hacerlo:
- Puede iniciar el agente ssh desde un script de inicio cuando se inicia el servidor y hacer eco de la salida en un archivo (con los derechos de acceso adecuados para evitar un uso indebido). Si hace que la clave no tenga contraseña, también puede agregar la clave desde el script. (Obviamente, la última parte sólo es recomendable cuando la cuenta a la que te estás conectando tiene derechos muy limitados en el servidor remoto). Luego haga que su secuencia de comandos lea la información del agente SSH del archivo creado al inicio.
- Utilice la pantalla cuando inicie sesión en la cuenta de servicio; luego desconéctese de la sesión de pantalla una vez que haya iniciado el agente.
- Utilice nohup al iniciar el agente.
Si el agente ssh no está muerto, pero ha perdido la información del entorno, asegúrese de que cuando lo inicie escriba sus variables de entorno en un archivo específico. Luego, al iniciar sesión, haga que su shell obtenga ese archivo.
Respuesta2
Si está utilizando un método de invocación de sub-shell, el agente ssh morirá al cerrar sesión en el shell. Si utiliza el método eval, el shell seguirá ejecutándose hasta que finalice manualmente.
Ver:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm
Específicamente:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm#ch06-50031.html
Además, sé que ejecutar desde variables cron ENV puede causar problemas. Entonces esa es otra área a revisar.