Chi sta avviando il mio agente ssh e perché non terminerà correttamente?


9

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-agentprocesso veniva generato su RPi ogni volta che eseguivo l' accesso, ma non veniva mai ucciso durante l' exiting: il login e il logout diverse volte causavano la generazione di un sacco di ssh-agentprocessi 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-agente 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 ~/.bashrcprovoca la generazione di un'altra istanza ssh-agent. Ho letto sulla relativa pagina manche la variabile di ambiente SSH_AGENT_PIDdovrebbe essere definita perché il ssh-agentprogramma dovrebbe essere avviato all'interno di un evalper 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_PIDe 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 -ktenta di leggere il suo PID dalla variabile di ambiente che non è impostata.

Il problema

Dal momento che ssh-agentnon 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-agental 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-agentviene 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 vila stringa sshall'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 systemdservizi pertinenti , ma ho trovato solo ciò ssh.serviceche è 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/picartella in una cartella temporanea e disconnettermi e riconnetterlo, ma ho ssh-agentcomunque 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-agente lo ho sostituito con quello falso impostando le autorizzazioni / utente / gruppo corretti, ho eseguito di source ~/.bashrcnuovo, quindi ho stampato il LOGfile:

-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 dummyusando useradd -m dummy, e accedendo non si avvia alcunossh-agent (penso che questo potrebbe significare qualcosa). Lo diff /home/pi/.bashrc /home/dummy/.bashrcspettacolo praticamente nulla (solo un commento che ho fatto), lo stesso per diff /home/pi/.profile /home/dummy/.profile.

  • Il socket dell'agente viene creato senza problemi anche se SSH_AUTH_SOCKnon è 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-agentprocesso.

  • 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 -sricorsiva utilizzando grepin /etce /libnon produce risultati.

  • Non ho installato un ambiente desktop, ma ho una /etc/X11cartella 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:

  1. Dove e come viene ssh-agentgenerato, chi emette il comando?
  2. Perché non viene chiamato nel modo corretto, senza impostare le variabili di ambiente necessarie e quindi lasciare il processo appeso lì indefinitamente?

Mi chiedo che cosa hai nel tuo ~/.bashrcallora.
ilkkachu,

@ilkkachu bene, qui si va ...
Marco Bonelli

Risposte:


1

Conosco un paio di possibili motivi:

  • se lo stai utilizzando libpam-ssh, può avviare automaticamente un agente SSH per te durante l'avvio di una sessione e persino caricare automaticamente le tue chiavi se non hanno passphrase o la loro passphrase è uguale alla password di accesso.

  • se lo stai utilizzando gpg-agent, può facoltativamente svolgere anche il compito di ssh-agent. Il suo arresto è gestito in modo diverso, quindi ci sarà solo la SSH_AUTH_SOCKvariabile d'ambiente, non quellaSSH_AGENT_PID

  • se si dispone di un agente SSH (ad esempio Pageant di PuTTY) in esecuzione sulla propria stazione di lavoro e si effettua una connessione SSH con l'inoltro dell'agente abilitato (e il telecomando lo sshdconsente), sull'host remoto si vedrà di nuovo solo SSH_AUTH_SOCKsenza il SSH_AGENT_PID... perché il socket dell'agente va a sshdquale tunnel lo riporta all'agente SSH della workstation locale.


1
Grazie per i suggerimenti, ma purtroppo nessuna di queste opzioni si applica a me. Non ho libpam-ssh; entrambi SSH_AGENT_PIDe SSH_AUTH_SOCKnon sono impostati (il socket è ovviamente presente comunque); Non utilizzo gpg-agente non ho abilitato l'inoltro dell'agente su PuTTY. Mi sono davvero perso: \
Marco Bonelli il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.