Este es un problema que he tenido durante mucho tiempo, pero cada vez que trato de resolver algo me pierdo, así que pensé que sería mejor preguntar aquí dónde quizás alguien más experimentado podría ayudarme.
Antecedentes
Mi Raspberry Pi ejecuta Raspbian Jessie, y uso SSH a menudo para iniciar sesión y ejecutar comandos de forma remota. Durante mis primeras sesiones de SSH, noté que ssh-agent
se generaba un proceso en el RPi cada vez que iniciaba sesión, pero nunca terminaba cuando se iniciabaexit
: al iniciar y cerrar sesión varias veces, se generaba un montón de ssh-agent
procesos para quedar colgado allí sin hacer nada. Jugueteando y leyendo páginas de manual y respuestas aquí y allá recientemente entendí el propósito ssh-agent
, y también aprendí que normalmente debería ser asesinado al cerrar sesión, así que comencé a preguntarme por qué no. Además, noté que la emisión source ~/.bashrc
causa que se genere otra instancia ssh-agent
. Lo leí en la página man relativaque la variable de entorno SSH_AGENT_PID
debe definirse porque el ssh-agent
programa debe iniciarse dentro de un eval
para ejecutar su salida y definir dichas variables, que luego son utilizadas por otros comandos relacionados con SSH, incluido ssh-agent -k
(para matar al agente en relación con la sesión actual), por lo que corrió echo $SSH_AGENT_PID
y echo $SSH_AUTH_SOCK
, pero ambos estaban vacíos. De repente me di cuenta: probablemente el proceso no se mata al cerrar sesión porque ssh-agent -k
intenta leer su PID de la variable de entorno que no está configurada.
El problema
Dado ssh-agent
que no se está eliminando al cerrar sesión, y esto seguramente sucede porque las variables de entorno necesarias no están configuradas, solo puede significar una cosa: quien llame ssh-agent
al iniciar sesión probablemente no lo haga de la manera correcta (que sería eval "$(ssh-agent -s)"
) . Entonces pensé: bueno, ¿cuál es el problema? ¡Solo encontraré el archivo de configuración, servicio o script de inicio de sesión que se ejecute para iniciar el agente y solucionarlo manualmente! ¿Dónde demonios podría estar?
Lo que he intentado
Como me di cuenta de que ssh-agent
se genera un an cada vez que llamo source ~/.bashrc
, este fue el primer archivo que inspeccioné, pero nada allí ni remotamente hacía referencia a nada relacionado con SSH. Seguí buscando usando vi
la cadena ssh
dentro de todos los siguientes archivos, pero no encontré nada :
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
¿Hay algún archivo más en el que pueda estar involucrado source ~/.bashrc
? Realmente no lo se.
Luego busqué systemd
servicios relevantes , pero solo encontré ssh.service
, que es WantedBy=multi-user.target
, y por lo tanto no se ejecuta al iniciar sesión (y bueno, eso es obvio ya que este es el demonio del servidor SSH).
También intenté mover todos los archivos de mi /home/pi
carpeta a una carpeta temporal y cerrar sesión y volver a iniciarla, pero ssh-agent
aún así se generó.
Eventualmente, también disparé el último disparo que tuve en la cámara: corrí find / -name 'ssh-agent'
como root, que solo imprimió /usr/bin/ssh-agent
, un ejecutable, así que creé un ejecutable falso que básicamente solo registró el comando principal :
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Cambié el nombre del real /usr/bin/ssh-agent
y lo reemplacé con el falso configurando los permisos / usuario / grupo correctos, ejecuté source ~/.bashrc
nuevamente, luego imprimí el LOG
archivo:
-bash
-bash
Ni una sola pista de lo que está sucediendo.
Algunos mas detalles
Estoy agregando algunos detalles más, no sé si podrían ser útiles o no, pero ya sabes ... más vale prevenir que curar.
Aquí está mi
.bashrc
.Creé un nuevo usuario llamado
dummy
usandouseradd -m dummy
, e iniciar sesión en él no comienza ningunossh-agent
(siento que esto podría significar algo). Eldiff /home/pi/.bashrc /home/dummy/.bashrc
programa básicamente no es nada (solo un comentario que hice), lo mismo paradiff /home/pi/.profile /home/dummy/.profile
.El socket del agente se crea sin problemas aunque
SSH_AUTH_SOCK
no esté configurado:pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/ total 0 srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
No estoy seguro de por qué, pero el número en el nombre del archivo del socket siempre es el que está inmediatamente antes del PID del
ssh-agent
proceso.Fragmento de
htop
:PID USER PRI NI VIRT RES SHR S Command 1 root 20 0 5472 3900 2728 S /sbin/init 1329 pi 20 0 3696 224 16 S └─ ssh-agent -s
Paquetes instalados que coinciden
ssh
:pi:~$ apt list --installed | grep ssh libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed] libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic] libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic] openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed] sshpass/oldstable,now 1.05-1 armhf [installed]
La búsqueda de
ssh-agent -s
uso recursivogrep
en/etc
y/lib
no produce resultados.No tengo instalado un entorno de escritorio, pero tengo una
/etc/X11
carpeta con algunos archivos de configuración. Intenté cambiar el nombre de la carpeta a otra cosa y reiniciar por si acaso, pero el proceso aún se genera, por lo que aparentemente eso no tiene mucho que ver con esto.
Conclusión
Ahora, para hacerlo lo más simple posible, solo tengo dos preguntas:
- ¿Dónde y cómo se
ssh-agent
genera esto , quién emite el comando? - ¿Por qué no se llama de la manera adecuada, sin establecer las variables de entorno necesarias y, por lo tanto, dejar que el proceso se quede allí indefinidamente?
~/.bashrc
entonces.Respuestas:
Conozco un par de posibles razones:
si está utilizando
libpam-ssh
, puede iniciar automáticamente un agente SSH para usted como parte del inicio de una sesión, e incluso cargar automáticamente sus claves si no tienen frase de contraseña o si su frase de contraseña es la misma que su contraseña de inicio de sesión.si está utilizando
gpg-agent
, opcionalmente también puede realizar la tarea delssh-agent
. Su apagado se maneja de manera diferente, por lo que solo habrá laSSH_AUTH_SOCK
variable de entorno, no elSSH_AGENT_PID
si tiene un agente SSH (por ejemplo, el concurso de PuTTY) ejecutándose en su estación de trabajo y establece una conexión SSH con el reenvío del agente habilitado (y el control remoto lo
sshd
permite), en el host remoto volverá a ver soloSSH_AUTH_SOCK
sin elSSH_AGENT_PID
... porque el conector del agente va asshd
qué túneles lo devuelve al agente SSH de su estación de trabajo local.fuente
libpam-ssh
; ambosSSH_AGENT_PID
y noSSH_AUTH_SOCK
están configurados (el zócalo, por supuesto, está presente de todos modos); No usogpg-agent
y no tengo el reenvío de agente habilitado en PuTTY. Estoy realmente perdido: \