Dies ist ein Problem, das ich schon lange habe, aber jedes Mal, wenn ich versuche, etwas herauszufinden, verliere ich mich. Deshalb dachte ich mir, ich sollte hier besser fragen, wo mir vielleicht jemand mit mehr Erfahrung helfen könnte.
Hintergrund
Auf meinem Raspberry Pi wird Raspbian Jessie ausgeführt, und ich verwende SSH häufig, um mich anzumelden und Befehle remote auszuführen. Während meiner ersten SSH-Sitzungen bemerkte ich, dass jedes Mal, wenn ich mich anmeldete , ein ssh-agent
Prozess auf dem RPi erzeugt wurde , der jedoch beim exit
Anmelden nie beendet wurde : Durch mehrmaliges An- und Abmelden wurden eine Reihe von ssh-agent
Prozessen erzeugt, die nur hängen blieben und nichts taten. Ich habe hier und da herumgespielt und Manpages und Antworten gelesen. Ich habe kürzlich den Zweck von verstanden ssh-agent
und auch gelernt, dass es normalerweise beim Abmelden getötet werden sollte, also begann ich mich zu fragen, warum es nicht so war. Außerdem habe ich festgestellt, dass durch das Ausgeben source ~/.bashrc
eine weitere Instanz von erzeugt wird ssh-agent
. Ich habe auf der entsprechenden Manpage gelesendass die Umgebungsvariable definiert werden SSH_AGENT_PID
sollte, weil das ssh-agent
Programm innerhalb von gestartet werden sollte eval
, um seine Ausgabe auszuführen und solche Variablen zu definieren, die dann von anderen SSH-bezogenen Befehlen verwendet werden, einschließlich ssh-agent -k
(um den Agenten relativ zur aktuellen Sitzung zu beenden), also I. lief echo $SSH_AGENT_PID
und echo $SSH_AUTH_SOCK
, aber sie waren beide leer. Mir wurde plötzlich klar: Wahrscheinlich wird der Prozess beim Abmelden nicht abgebrochen, weil ssh-agent -k
versucht wird, seine PID aus der nicht festgelegten Umgebungsvariablen zu lesen.
Das Problem
Da ssh-agent
dies beim Abmelden nicht beendet wird und dies sicher geschieht, weil die erforderlichen Umgebungsvariablen nicht festgelegt sind, kann dies nur eines bedeuten: Wer sich ssh-agent
anmeldet, tut dies wahrscheinlich nicht ordnungsgemäß (was der Fall wäre eval "$(ssh-agent -s)"
) . Also dachte ich: Nun, was ist das Problem? Ich finde nur die Konfigurationsdatei, den Dienst oder das Anmeldeskript, die ausgeführt werden, um den Agenten zu starten und manuell zu reparieren! Wo um alles in der Welt könnte es sein?
Was ich versucht habe
Da ich bemerkte, dass ssh-agent
jedes Mal source ~/.bashrc
, wenn ich anrufe, ein erscheint , war dies die erste Datei, die ich inspizierte, aber nichts dort verwies auch nur aus der Ferne auf irgendetwas, das mit SSH zu tun hatte. Ich habe in allen folgenden Dateien vi
nach der Zeichenfolge gesucht ssh
, aber nichts gefunden :
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
Gibt es noch weitere Dateien, an denen beteiligt sein könnte source ~/.bashrc
? Ich weiß es nicht wirklich.
Dann habe ich nach relevanten systemd
Diensten gesucht , aber nur gefunden ssh.service
, was ist WantedBy=multi-user.target
und daher nicht beim Login ausgeführt wird (und das ist offensichtlich, da dies der SSH-Server-Daemon ist).
Ich habe auch versucht, jede einzelne Datei in meinem /home/pi
Ordner in einen temporären Ordner zu verschieben und mich abzumelden und wieder anzumelden, bin aber ssh-agent
trotzdem aufgetaucht.
Schließlich habe ich auch den letzten Schuss abgefeuert, den ich in der Kammer hatte: Ich lief find / -name 'ssh-agent'
als root, der nur /usr/bin/ssh-agent
eine ausführbare Datei druckte , also erstellte ich eine gefälschte ausführbare Datei, die im Grunde nur den übergeordneten Befehl protokollierte :
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Ich habe den Real umbenannt /usr/bin/ssh-agent
und durch den falschen ersetzt, der die richtigen Berechtigungen / Benutzer / Gruppen festlegt, source ~/.bashrc
erneut ausgeführt und dann die LOG
Datei gedruckt :
-bash
-bash
Kein einziger Hinweis darauf, was los ist.
Einige weitere Details
Ich füge noch einige Details hinzu, ich weiß nicht, ob sie hilfreich sein könnten oder nicht, aber Sie wissen ... besser sicher als leid.
Hier ist meine
.bashrc
.Ich habe einen neuen Benutzer mit dem Namen
dummy
using erstelltuseradd -m dummy
, und die Anmeldung startet keinenssh-agent
(ich glaube, dies könnte etwas bedeuten). Dasdiff /home/pi/.bashrc /home/dummy/.bashrc
zeigt im Grunde nichts (nur ein Kommentar, den ich gemacht habe), das gleiche fürdiff /home/pi/.profile /home/dummy/.profile
.Der Agent-Socket wird problemlos erstellt, obwohl er
SSH_AUTH_SOCK
nicht festgelegt ist:pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/ total 0 srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
Ich weiß nicht warum, aber die Nummer im Socket-Dateinamen ist immer die Nummer unmittelbar vor der PID des
ssh-agent
Prozesses.Ausschnitt aus
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
Installierte Pakete passend
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]
Die Suche nach
ssh-agent -s
rekursiv mitgrep
in/etc
und/lib
liefert keine Ergebnisse.Ich habe keine Desktop-Umgebung installiert, aber ich habe einen
/etc/X11
Ordner mit einigen Konfigurationsdateien. Ich habe versucht, den Ordner in etwas anderes umzubenennen und für alle Fälle neu zu starten, aber der Prozess wird immer noch erzeugt, so dass das anscheinend nicht viel damit zu tun hat.
Fazit
Um es so einfach wie möglich zu machen, habe ich nur zwei Fragen:
- Wo und wie entsteht das
ssh-agent
, wer gibt den Befehl aus? - Warum wird es nicht ordnungsgemäß aufgerufen, ohne die erforderlichen Umgebungsvariablen festzulegen und den Prozess daher unbegrenzt hängen zu lassen?
~/.bashrc
.