Il mio caso d'uso è che ho un server senza testa su cui viene eseguito lo sviluppo del software. Di solito abilito l'inoltro X11 per le connessioni SSH ad esso, ma non posso per posizioni distanti con connessioni lente.
Ho bisogno di archiviazione sicura e memorizzazione nella cache per le mie credenziali git poiché lavoro regolarmente con 18-20 repository in un albero, quindi sto usando git-credential-gnome-keyring come git credential.helper, che comunica usando il libgnome-keyring al demone gnome-keyring. Per testare le soluzioni, ho installato un PC con un monitor, ho confermato che il portachiavi funzionava di default sul sistema, quindi l'ho provato con SSH. Funziona con l'inoltro X11, ma non funziona senza di esso.
Quando sono connesso senza inoltro X11, il seguente errore si verifica quando viene richiesto il portachiavi e lo strumento torna al prompt sulla riga di comando:
** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon
L'indagine rivela che il problema di base è che gnome-keyring-daemon si aspetta che le connessioni utilizzino dbus per parlarci. Il dbus non viene avviato se non esiste una sessione X11, quindi non esiste un bus dbus comune per il gnome-keyring-daemon e il libgnome-keyring a cui connettersi.
Ho trovato due soluzioni che altri hanno pubblicato per questo problema, sebbene nessuna delle due funzioni correttamente per me.
- Ottieni una porta DBUS da una sessione esistente che utilizza X11
- Avviare manualmente una nuova porta DBUS
Quando si collega a una porta DBUS esistente, il concetto di base è quello di trovare il PID di una sessione di accesso esistente, scaricare l'ambiente per quel PID dai procf, cercarlo per DBUS_SESSION_BUS_ADDRESS
ed esportarlo nell'ambiente corrente. Poiché questa è la variabile utilizzata per pubblicare il bus DBUS utilizzato da tutto nelle sessioni, l'impostazione dovrebbe consentire a tutto nella sessione di comunicare su un bus DBUS comune, sebbene sia il bus associato a una sessione diversa.
Fonti qui:
https://ubuntuforums.org/showthread.php?t=1059023
https://ask.fedoraproject.org/en/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh- sessione /
codice aggiunto al mio .bashrc in esecuzione su login 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
Il secondo metodo, l'avvio manuale di DBUS per la sessione, prevede l'utilizzo dbus-launch
di creare una nuova sessione e impostare l' DBUS_SESSION_BUS_ADDRESS
ambiente per, quindi avviare gnome-keyring-daemon con tutti i servizi necessari in modo che vedrà l'indirizzo del bus DBUS che abbiamo creato piuttosto che un indirizzo bus vuoto. Questa soluzione potrebbe richiedere o meno la modifica di gnome-keyring-daemon per eseguire un'istanza per sessione anziché un'istanza per sistema, ma non è chiaro.
Fonti: a
partire dal numero 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
Come modificare la riga "Exec" di un servizio dbus senza perdere le modifiche in caso di aggiornamento
Codice aggiunto al mio .bashrc in esecuzione al login 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
Entrambe le soluzioni danno lo stesso risultato negativo. Invece di produrre immediatamente l'errore che indica che non è possibile comunicare con il demone gnome-keyring, il processo si blocca per un po 'e quindi produce questo output:
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
Non sono chiaro su come lo gnome-keyring-daemon stia interagendo con DBUS, ma dalla sua seconda serie di errori risulta chiaro che non è raggiungibile tramite un bus DBUS appena creato o cross-process su un bus DBUS diverso. Alcune delle cose che ho trovato suggeriscono che il demone gnome-keyring potrebbe aver bisogno del DBUS avviato prima di esso, ma non è chiaro se sia il caso dell'uso (libgnome-keyring) o del demone.
Come faccio a farlo funzionare?