Mein Anwendungsfall ist, dass ich einen Headless-Server habe, auf dem die Softwareentwicklung ausgeführt wird. Normalerweise aktiviere ich die X11-Weiterleitung für die SSH-Verbindungen, nicht jedoch für entfernte Standorte mit langsamen Verbindungen.
Ich benötige eine sichere Speicherung und Zwischenspeicherung für meine git-Anmeldeinformationen, da ich regelmäßig mit 18 bis 20 Repositorys in einem Baum arbeite. Daher verwende ich den git-credential-gnome-Schlüsselring als git credential.helper, der über den libgnome-Schlüsselring kommuniziert zum gnome-keyring-daemon. Um Lösungen zu testen, habe ich einen PC mit einem Monitor eingerichtet, den auf dem System standardmäßig funktionierenden Schlüsselbund bestätigt und ihn dann mit SSH ausprobiert. Es funktioniert mit der X11-Weiterleitung, aber nicht ohne.
Wenn ich ohne X11-Weiterleitung verbunden bin, tritt der folgende Fehler auf, wenn der Schlüsselbund abgefragt wird und das Tool auf die Eingabeaufforderung in der Befehlszeile zurückgreift:
** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon
Untersuchungen haben ergeben, dass das Hauptproblem darin besteht, dass der Gnome-Keyring-Daemon erwartet, dass Verbindungen dbus verwenden, um mit ihm zu kommunizieren. Der dbus wird nicht gestartet, wenn keine X11-Sitzung vorhanden ist. Daher gibt es keinen gemeinsamen dbus-Bus für den Gnome-Keyring-Daemon und den Libgnome-Keyring, zu dem eine Verbindung hergestellt werden kann.
Ich habe zwei Lösungen gefunden, die andere zu diesem Problem gepostet haben, obwohl keine für mich richtig funktioniert.
- Rufen Sie einen DBUS-Port aus einer vorhandenen Sitzung ab, die X11 verwendet
- Starten Sie manuell einen neuen DBUS-Port
Beim Anschließen an einen vorhandenen DBUS-Port besteht das Basiskonzept darin, die PID einer vorhandenen Anmeldesitzung zu ermitteln, die Umgebung für diese PID aus dem procfs auszulesen, nach der zu suchen DBUS_SESSION_BUS_ADDRESS
und in die aktuelle Umgebung zu exportieren. Da dies die Variable ist, die zum Veröffentlichen des DBUS-Busses verwendet wird, der von allen in den Sitzungen verwendeten Daten verwendet wird, sollte diese Einstellung ermöglichen, dass alle Daten in der Sitzung auf einem gemeinsamen DBUS-Bus kommunizieren, obwohl dies der Bus ist, der einer anderen Sitzung zugeordnet ist.
Quellen hier:
https://ubuntuforums.org/showthread.php?t=1059023
https://ask.fedoraproject.org/de/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh- session /
Code wurde zu meiner .bashrc hinzugefügt, die bei der ssh-Anmeldung ausgeführt wird:
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
local myPID=`pgrep "(.*session|fluxbox)" | head -n1`
if [ -n "$myPID" ] ; then
local myVar=`cat /proc/${myPID}/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=" | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
if [ -n "$myVar" ] ; then
export DBUS_SESSION_BUS_ADDRESS=$myVar
fi
fi
fi
Die zweite Methode, DBUS für die Sitzung manuell zu starten, besteht dbus-launch
darin, eine neue Sitzung zu erstellen und die DBUS_SESSION_BUS_ADDRESS
für die Umgebung festzulegen. Anschließend wird der Gnome-Keyring-Daemon mit allen erforderlichen Diensten gestartet, damit die von uns erstellte DBUS-Busadresse angezeigt wird anstatt einer leeren Busadresse. Diese Lösung erfordert möglicherweise, dass der gnome-keyring-daemon so geändert wird, dass nur eine Instanz pro Sitzung und nicht eine Instanz pro System ausgeführt wird. Dies ist jedoch nicht klar.
Quellen:
Ab Nummer 8: https://support.wandisco.com/index.php?/Knowledgebase/Article/View/362/17/how-to-setup-encrypted-svn-password-storage-using-gnome- keyring-in-an-ssh-session
So ändern Sie die Exec-Zeile eines dbus-Dienstes, ohne die Änderungen bei einem Upgrade zu verlieren
Code, der zu meiner .bashrc hinzugefügt wurde und bei der ssh-Anmeldung ausgeführt wird:
# then DBUS wasn't started for this session and needs to be
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
# start a new dbus session and make sure the variables are exported (automatic output)
eval `dbus-launch --sh-syntax`
# make sure gnome-keyring-daemon is using all the necessary components (it may not be by default)
# Capture the output, which is a series of variable setting commands, one on eachline, and
# export them while setting them
while read -r LINE
do
export $LINE
done <<< $(gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
fi
Beide Lösungen führen zu demselben Fehlerergebnis. Anstatt sofort den Fehler zu erzeugen, der darauf hinweist, dass der Gnome-Keyring-Daemon nicht kommuniziert werden kann, bleibt der Prozess eine Weile hängen und erzeugt dann die folgende Ausgabe:
Gkr-Message: secret service operation failed: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
** (process:31155): CRITICAL **: Error communicating with gnome-keyring-daemon
Ich bin nicht sicher, wie der Gnome-Keyring-Daemon mit DBUS interagiert, aber aus der zweiten Fehlermenge geht hervor, dass er nicht über einen neu erstellten DBUS-Bus oder über einen anderen DBUS-Bus prozessübergreifend erreichbar ist. Einige meiner Erkenntnisse legen nahe, dass der Gnome-Keyring-Daemon möglicherweise den DBUS benötigt, bevor er gestartet wird. Es ist jedoch unklar, ob dies für die Verwendung (libgnome-keyring) oder den Daemon der Fall ist.
Wie bekomme ich das zum Laufen?