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-agent
processo era gerado no RPi toda vez que eu fazia login, mas nunca matava ao exit
entrar: o login e o logout várias vezes faziam com que vários ssh-agent
processos 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-agent
e 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 ~/.bashrc
faz com que outra instância ssh-agent
seja gerada. Eu li na página de manual relativaque a variável de ambiente SSH_AGENT_PID
deve ser definida porque o ssh-agent
programa deve ser iniciado dentro de um eval
para 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_PID
e echo $SSH_AUTH_SOCK
, mas ambos estavam vazios. De repente, percebi: provavelmente o processo não é interrompido no logout porque ssh-agent -k
tenta ler seu PID a partir 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 só pode significar uma coisa: quem chama o ssh-agent
login 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 vi
a string ssh
dentro 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 systemd
serviços relevantes , mas só encontrei ssh.service
, o que é WantedBy=multi-user.target
e, 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/pi
pasta para uma pasta temporária e sair e entrar novamente, mas ssh-agent
ainda 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-agent
e o substitui pelo falso, definindo as permissões / usuário / grupo corretos, executei source ~/.bashrc
novamente e imprimi o LOG
arquivo:
-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
dummy
usinguseradd -m dummy
, e o login nele não inicia nenhumssh-agent
(acho que isso pode significar algo). Osdiff /home/pi/.bashrc /home/dummy/.bashrc
programas 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_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 número imediatamente anterior ao PID do
ssh-agent
processo.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
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 -s
usando recursivamente usandogrep
in/etc
e/lib
não produz resultados.Não tenho um ambiente de área de trabalho instalado, mas tenho uma
/etc/X11
pasta 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-agent
gerado, 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?
~/.bashrc
então.Respostas:
Conheço algumas razões possíveis:
se você estiver usando
libpam-ssh
, ele poderá iniciar automaticamente um agente SSH para você como parte de uma sessão e até carregar automaticamente suas chaves se elas não tiverem uma senha ou a senha for a mesma que sua senha de login.se você estiver usando
gpg-agent
, ele também pode executar a tarefa opcionalmentessh-agent
. Seu desligamento é tratado de maneira diferente; portanto, haverá apenas aSSH_AUTH_SOCK
variável de ambiente, não a variávelSSH_AGENT_PID
se você tiver um agente SSH (por exemplo, o PuTTY's Pageant) em execução na sua estação de trabalho e estabelecer uma conexão SSH com o encaminhamento de agente ativado (e o controle remoto
sshd
permitir), no host remoto você verá novamente apenasSSH_AUTH_SOCK
sem oSSH_AGENT_PID
... porque o soquete do agente vai para osshd
túnel de volta ao agente SSH da estação de trabalho local.fonte
libpam-ssh
; ambosSSH_AGENT_PID
eSSH_AUTH_SOCK
não estão definidos (o soquete está presente, de qualquer maneira); Não usogpg-agent
e não tenho o encaminhamento de agente ativado no PuTTY. Estou realmente perdido: \