Questo è un problema che ho da molto tempo, ma ogni volta che provo a capire qualcosa mi perdo, quindi ho pensato che sarebbe meglio chiedere qui dove forse qualcuno più esperto potrebbe aiutarmi.
sfondo
Il mio Raspberry Pi esegue Raspbian Jessie e utilizzo spesso SSH per accedervi ed eseguire comandi da remoto. Durante le mie prime sessioni SSH ho notato che un ssh-agent
processo veniva generato su RPi ogni volta che eseguivo l' accesso, ma non veniva mai ucciso durante l' exit
ing: il login e il logout diverse volte causavano la generazione di un sacco di ssh-agent
processi solo per essere lasciati appesi lì senza fare nulla. Giocherellando e leggendo pagine man e risposte qua e là, di recente ho capito lo scopo ssh-agent
e ho anche imparato che normalmente dovrebbe essere ucciso quando ci si disconnette, quindi ho iniziato a chiedermi perché non lo fosse. Inoltre, ho notato che l'emissione source ~/.bashrc
provoca la generazione di un'altra istanza ssh-agent
. Ho letto sulla relativa pagina manche la variabile di ambiente SSH_AGENT_PID
dovrebbe essere definita perché il ssh-agent
programma dovrebbe essere avviato all'interno di un eval
per eseguire il suo output e definire tali variabili, che sono quindi utilizzate da altri comandi relativi a SSH, incluso ssh-agent -k
(per uccidere l'agente rispetto alla sessione corrente), quindi I corse echo $SSH_AGENT_PID
e echo $SSH_AUTH_SOCK
, ma erano entrambi vuoti. All'improvviso mi sono reso conto: probabilmente il processo non viene interrotto al logout perché ssh-agent -k
tenta di leggere il suo PID dalla variabile di ambiente che non è impostata.
Il problema
Dal momento che ssh-agent
non viene ucciso al logout, e questo accade di sicuro perché le variabili di ambiente necessarie non sono impostate, può significare solo una cosa: chiunque chiami ssh-agent
al login probabilmente non lo fa nel modo corretto (che sarebbe eval "$(ssh-agent -s)"
) . Quindi ho pensato: beh, qual è il problema? Troverò semplicemente qualsiasi file di configurazione, servizio o script di accesso eseguito per avviare l'agente e risolverlo manualmente! Dove diavolo potrebbe essere?
Quello che ho provato
Dal momento che ho notato che ssh-agent
viene generato un ogni volta che chiamo source ~/.bashrc
, questo è stato il primo file che ho ispezionato, ma nulla di ciò ha fatto riferimento in remoto a qualcosa correlato a SSH. Ho continuato a cercare vi
la stringa ssh
all'interno di tutti i seguenti file, ma non ho trovato nulla :
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
C'è qualche altro file che potrebbe essere coinvolto source ~/.bashrc
? Non lo so davvero.
Quindi ho cercato i systemd
servizi pertinenti , ma ho trovato solo ciò ssh.service
che è WantedBy=multi-user.target
, e quindi non viene eseguito all'accesso (e bene, questo è ovvio poiché si tratta del demone del server SSH).
Ho anche provato a spostare ogni singolo file nella mia /home/pi
cartella in una cartella temporanea e disconnettermi e riconnetterlo, ma ho ssh-agent
comunque generato.
Alla fine, ho anche sparato l'ultimo colpo che avevo nella camera: correvo find / -name 'ssh-agent'
come root, che stampava solo /usr/bin/ssh-agent
, un eseguibile, quindi ho creato un eseguibile falso che praticamente registrava solo il comando genitore :
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Ho rinominato il reale /usr/bin/ssh-agent
e lo ho sostituito con quello falso impostando le autorizzazioni / utente / gruppo corretti, ho eseguito di source ~/.bashrc
nuovo, quindi ho stampato il LOG
file:
-bash
-bash
Non c'è un solo indizio su cosa stia succedendo.
Qualche dettaglio in più
Sto aggiungendo altri dettagli, non so se potrebbero essere utili o meno, ma sai ... meglio prevenire che curare.
Ecco la mia
.bashrc
.Ho creato un nuovo utente chiamato
dummy
usandouseradd -m dummy
, e accedendo non si avvia alcunossh-agent
(penso che questo potrebbe significare qualcosa). Lodiff /home/pi/.bashrc /home/dummy/.bashrc
spettacolo praticamente nulla (solo un commento che ho fatto), lo stesso perdiff /home/pi/.profile /home/dummy/.profile
.Il socket dell'agente viene creato senza problemi anche se
SSH_AUTH_SOCK
non è impostato:pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/ total 0 srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
Non so perché, ma il numero sul nome file del socket è sempre quello immediatamente precedente al PID del
ssh-agent
processo.Snippet di
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
Corrispondenza dei pacchetti installati
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 ricerca
ssh-agent -s
ricorsiva utilizzandogrep
in/etc
e/lib
non produce risultati.Non ho installato un ambiente desktop, ma ho una
/etc/X11
cartella con alcuni file di configurazione. Ho provato a rinominare la cartella in qualcos'altro e riavviare per ogni evenienza, ma il processo viene comunque generato, quindi apparentemente non ha molto a che fare con questo.
Conclusione
Ora, per renderlo il più semplice possibile, ho solo due domande:
- Dove e come viene
ssh-agent
generato, chi emette il comando? - Perché non viene chiamato nel modo corretto, senza impostare le variabili di ambiente necessarie e quindi lasciare il processo appeso lì indefinitamente?
~/.bashrc
allora.