Esse é um problema que tenho tido há muito tempo, mas toda vez que tento descobrir alguma coisa me perco, então achei melhor perguntar aqui onde talvez alguém mais experiente possa me ajudar.
fundo
Meu Raspberry Pi está executando o Raspbian Jessie, e eu uso o SSH frequentemente para fazer login e executar comandos remotamente. Durante minhas primeiras sessões de SSH, notei que um ssh-agentprocesso era gerado no RPi toda vez que eu fazia login, mas nunca matava ao exitentrar: o login e o logout várias vezes faziam com que vários ssh-agentprocessos fossem gerados apenas para ficar lá sem fazer nada. Brincando e lendo páginas de manual e respostas aqui e ali, eu entendi recentemente o propósito ssh-agente também aprendi que ele normalmente deveria ser morto ao sair, então comecei a me perguntar por que não era. Além disso, notei que a emissão source ~/.bashrcfaz com que outra instância ssh-agentseja gerada. Eu li na página de manual relativaque a variável de ambiente SSH_AGENT_PIDdeve ser definida porque o ssh-agentprograma deve ser iniciado dentro de um evalpara executar sua saída e definir essas variáveis, que são usadas por outros comandos relacionados ao SSH, incluindo ssh-agent -k(para matar o agente em relação à sessão atual), então eu correu echo $SSH_AGENT_PIDe echo $SSH_AUTH_SOCK, mas ambos estavam vazios. De repente, percebi: provavelmente o processo não é interrompido no logout porque ssh-agent -ktenta ler seu PID a partir da variável de ambiente que não está definida.
O problema
Como ssh-agentnã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 só pode significar uma coisa: quem chama o ssh-agentlogin provavelmente não o faz da maneira correta (o que seria eval "$(ssh-agent -s)") . Então pensei: bem, qual é o problema? Vou encontrar o arquivo de configuração, serviço ou script de login executado para iniciar o agente e corrigi-lo manualmente! Onde diabos poderia estar?
O que eu tentei
Desde que notei que um ssh-agenté gerado toda vez que ligo source ~/.bashrc, esse foi o primeiro arquivo que inspecionei, mas nada lá remotamente referenciou algo relacionado ao SSH. Continuei pesquisando usando via string sshdentro de todos os seguintes arquivos, 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 possa estar envolvido source ~/.bashrc? Eu realmente não sei.
Então procurei por systemdserviços relevantes , mas só encontrei ssh.service, o que é WantedBy=multi-user.targete, portanto, não é executado no logon (e bem, isso é óbvio, pois esse é o daemon do servidor SSH).
Também tentei mover todos os arquivos da minha /home/pipasta para uma pasta temporária e sair e entrar novamente, mas ssh-agentainda gerava.
Por fim, também dei o último tiro que tinha na câmara: corri find / -name 'ssh-agent'como root, que apenas imprimia /usr/bin/ssh-agent, um executável, então criei um executável falso que basicamente registrava apenas o comando pai :
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Renomeei o real /usr/bin/ssh-agente o substitui pelo falso, definindo as permissões / usuário / grupo corretos, executei source ~/.bashrcnovamente e imprimi o LOGarquivo:
-bash
-bash
Nem uma pista sobre o que está acontecendo.
Mais alguns detalhes
Estou adicionando mais alguns detalhes, não sei se eles podem ser úteis ou não, mas você sabe ... é melhor prevenir do que remediar.
Aqui está o meu
.bashrc.Eu criei um novo usuário chamado
dummyusinguseradd -m dummy, e o login nele não inicia nenhumssh-agent(acho que isso pode significar algo). Osdiff /home/pi/.bashrc /home/dummy/.bashrcprogramas basicamente nada (apenas um comentário que fiz), o mesmo paradiff /home/pi/.profile /home/dummy/.profile.O soquete do agente é criado sem problemas, embora
SSH_AUTH_SOCKnão esteja definido:pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/ total 0 srw------- 1 pi pi 0 Jan 28 03:12 agent.1328Não sei por que, mas o número no nome do arquivo do soquete é sempre o número imediatamente anterior ao PID do
ssh-agentprocesso.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 -sPacotes instalados correspondentes
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
ssh-agent -susando recursivamente usandogrepin/etce/libnão produz resultados.Não tenho um ambiente de área de trabalho instalado, mas tenho uma
/etc/X11pasta com alguns arquivos de configuração. Tentei renomear a pasta para outra coisa e reiniciar, apenas por precaução, mas o processo ainda é gerado, aparentemente, isso não tem muito a ver com isso.
Conclusão
Agora, para simplificar o máximo possível, só tenho duas perguntas:
- Onde e como isso é
ssh-agentgerado, quem emite o comando? - Por que não é chamado da maneira correta, sem definir as variáveis de ambiente necessárias e, portanto, deixando o processo travado por tempo indeterminado?
~/.bashrcentão.