Mój przypadek użycia polega na tym, że mam serwer bezgłowy, na którym odbywa się tworzenie oprogramowania. Zazwyczaj włączam przekazywanie X11 dla połączeń SSH do niego, ale nie mogę dla odległych lokalizacji z powolnymi połączeniami.
Potrzebuję bezpiecznego przechowywania i buforowania moich poświadczeń git, ponieważ regularnie pracuję z 18-20 repozytoriami w drzewie, więc używam git-credential-gnome-keyring jako git credential.helper, który komunikuje się za pomocą libgnome-keyring do gnome-keyring-daemon. Aby przetestować rozwiązania, zainstalowałem komputer z monitorem, potwierdziłem, że brelok działa domyślnie w systemie, a następnie wypróbowałem go z SSH. Działa z przekazywaniem X11, ale nie działa bez niego.
Gdy jestem połączony bez przekazywania X11, po zapytaniu o klucz pojawia się następujący błąd, a narzędzie powraca do monitowania w wierszu polecenia:
** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon
Dochodzenie ujawnia, że podstawowym problemem jest to, że demon klucza-gnome oczekuje, że połączenia będą używać dbus do rozmowy z nim. Dbus nie jest uruchamiany, jeśli nie ma sesji X11, więc nie ma wspólnej magistrali dbus dla gnome-keyring-demona i libgnome-keyring, z którymi można się połączyć.
Znalazłem dwa rozwiązania, które inni napisali o tym problemie, ale żadne z nich nie działa poprawnie dla mnie.
- Uzyskaj port DBUS z istniejącej sesji korzystającej z X11
- Ręcznie uruchom nowy port DBUS
Podczas podłączania do istniejącego portu DBUS podstawową koncepcją jest znalezienie PID istniejącej sesji logowania, zrzucenie środowiska dla tego PID z procfs, wyszukanie go DBUS_SESSION_BUS_ADDRESS
i wyeksportowanie w bieżącym środowisku. Ponieważ jest to zmienna używana do publikowania magistrali DBUS używanej przez wszystko w sesjach, ustawienie tej opcji powinno umożliwić wszystkim w sesji komunikowanie się na wspólnej magistrali DBUS, chociaż jest to magistrala związana z inną sesją.
Źródła tutaj:
https://ubuntuforums.org/showthread.php?t=1059023
https://ask.fedoraproject.org/en/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh- sesja /
Kod dodany do mojego .bashrc wykonywany przy logowaniu ssh:
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
Druga metoda, ręczne uruchamianie DBUS dla sesji, polega dbus-launch
na utworzeniu nowej sesji i ustawieniu DBUS_SESSION_BUS_ADDRESS
środowiska, a następnie uruchomieniu demona klucza gnome ze wszystkimi niezbędnymi usługami, aby zobaczył utworzony przez nas adres magistrali DBUS zamiast pustego adresu magistrali. To rozwiązanie może, ale nie musi, wymagać zmiany demona gnome-keyring-demona, aby uruchamiał jedną instancję na sesję zamiast jednej instancji na system, ale nie jest to jasne.
Źródła:
począwszy od numeru 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
Jak zmodyfikować linię „Exec” usługi dbus bez utraty zmian w przypadku aktualizacji
Kod dodany do mojego .bashrc wykonywanego przy logowaniu ssh:
# 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
Oba rozwiązania dają ten sam nieudany wynik. Zamiast natychmiastowego wygenerowania błędu wskazującego, że nie można nawiązać komunikacji z demonem-kluczem-gnome, proces zawiesza się na chwilę, a następnie generuje następujące dane wyjściowe:
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
Nie jestem pewien, w jaki sposób demon gnome-keyring wchodzi w interakcję z DBUS, ale z drugiego zestawu błędów wynika, że nie jest osiągalny przez nowo utworzoną magistralę DBUS lub cross-process na innej magistrali DBUS. Niektóre z tego, co znalazłem, sugerują, że demon gnome-keyring może wymagać uruchomienia DBUS przed nim, ale nie jest jasne, czy tak jest w przypadku użycia (libgnome-keyring) czy demona.
Jak mogę to uruchomić?