Este é um problema que eu tenho tendo há muito tempo, mas toda vez que eu tento descobrir algo me perco, então achei melhor perguntar aqui onde talvez alguém mais experiente pudesse me ajudar.
Antecedentes
Meu Raspberry Pi está executando o Raspbian Jessie, e eu uso o SSH com frequência para fazer login nele e executar comandos remotamente. Durante minhas primeiras sessões SSH notei que um processo ssh-agent
foi gerado no RPi toda vez que eu entrei, mas nunca matei quando exit
ing: logar e sair várias vezes causou um monte de ssh-agent
processa para ser gerado apenas para ficar pendurado lá sem fazer nada. Brincando e lendo man pages e respostas aqui e ali eu recentemente entendi o propósito de ssh-agent
, e eu também aprendi que normalmente deveria ser morto quando sair, então eu comecei a me perguntar por que não era. Além disso, notei que a emissão de source ~/.bashrc
faz com que outra instância de ssh-agent
seja gerada. Eu li na página de manual relativa que a variável de ambiente SSH_AGENT_PID
deveria ser definida porque a ssh-agent
programa deve ser iniciado dentro de um eval
para executar sua saída e definir tais variáveis, que são então usadas por outros comandos relacionados ao SSH, incluindo ssh-agent -k
(para matar o agente em relação à sessão atual), então corri echo $SSH_AGENT_PID
e echo $SSH_AUTH_SOCK
, mas ambos estavam vazios. De repente, percebi: provavelmente o processo não é morto no logout porque ssh-agent -k
tenta ler seu PID da variável de ambiente que não está definida.
O problema
Como ssh-agent
não está sendo eliminado no logout, e isso com certeza acontece porque as variáveis de ambiente necessárias não estão definidas, isso pode significar apenas uma coisa: quem chama ssh-agent
no login provavelmente não faça isso da maneira apropriada (que seria eval "$(ssh-agent -s)"
) . Então eu pensei: bem, qual é o problema? Apenas localizarei qualquer arquivo de configuração, serviço ou script de login executado para iniciar o agente e corrigi-lo manualmente! Onde na terra poderia ser?
O que eu tentei
Como percebi que um ssh-agent
é gerado toda vez que eu chamo source ~/.bashrc
, esse foi o primeiro arquivo que eu inspecionei, mas nada lá remotamente referenciava nada relacionado ao SSH. Continuei pesquisando usando vi
para a string ssh
dentro de todos os arquivos a seguir, mas não encontrei nada :
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
Existe mais algum arquivo que pode estar envolvido em source ~/.bashrc
? Eu não sei realmente.
Em seguida, pesquisei systemd
services relevante, mas encontrei apenas ssh.service
, que é WantedBy=multi-user.target
, e, portanto, não é executado no login (e bem, isso é óbvio, pois esse é o Daemon do servidor SSH).
Eu também tentei mover todos os arquivos da minha pasta /home/pi
para uma pasta temporária e fazer logout e voltar, mas ssh-agent
ainda gerou.
Eventualmente, eu também dei o último tiro que eu tinha na câmara: eu corri find / -name 'ssh-agent'
como root, que só imprimia /usr/bin/ssh-agent
, um executável, então eu criei um executável falso que basicamente registrava apenas o pai comando :
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Eu renomei o verdadeiro /usr/bin/ssh-agent
e o substitui pelo falso, definindo as permissões / usuário / grupo corretas, executei source ~/.bashrc
novamente e imprimi o arquivo LOG
:
-bash
-bash
Não há uma única pista sobre o que está acontecendo.
Mais alguns detalhes
Estou adicionando mais alguns detalhes, não sei se podem ser úteis ou não, mas você sabe ... é melhor prevenir do que remediar.
-
Eu criei um novo usuário chamado dummy
usando useradd -m dummy
, e fazer login não inicia nenhum ssh-agent
(acho que isso pode significar alguma coisa). O diff /home/pi/.bashrc /home/dummy/.bashrc
mostra basicamente nada (apenas um comentário que fiz), mesmo para diff /home/pi/.profile /home/dummy/.profile
.
-
O soquete do agente é criado sem problemas, mesmo que SSH_AUTH_SOCK
não esteja definido:
pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/
total 0
srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
Não sei por que, mas o número no nome do arquivo do soquete é sempre o imediatamente anterior ao PID do processo ssh-agent
.
-
Snippet 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
-
Pacotes instalados correspondentes a 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]
-
A pesquisa de ssh-agent -s
recursivamente usando grep
em /etc
e /lib
não produz resultados.
-
Não tenho um ambiente de área de trabalho instalado, mas tenho uma pasta /etc/X11
com alguns arquivos de configuração. Eu tentei renomear a pasta para outra coisa e reiniciar apenas no caso, mas o processo ainda é gerado, então aparentemente não tem muito a ver com isso.
Conclusão
Agora, para simplificar o processo, só tenho duas perguntas:
- Onde e como esse
ssh-agent
é gerado, quem emite o comando?
- Por que ele não é chamado da maneira correta, sem definir as variáveis de ambiente necessárias e, portanto, deixando o processo suspenso indefinidamente?