Meu caso de uso é que eu tenho um servidor sem cabeça no qual o desenvolvimento de software é executado. Normalmente, habilito o encaminhamento X11 para as conexões SSH, mas não posso para locais distantes com conexões lentas.
Preciso de armazenamento seguro e armazenamento em cache para minhas credenciais git, pois trabalho regularmente com 18 a 20 repositórios em uma árvore, então estou usando git-credential-gnome-keyring como o git credential.helper, que se comunica usando o libgnome-keyring para o gnome-keyring-daemon. Para testar as soluções, configurei um PC com um monitor, confirmei se o chaveiro funcionava por padrão no sistema e tentei com SSH. Funciona com encaminhamento X11, mas não funciona sem ele.
Quando estou conectado sem o encaminhamento X11, ocorre o seguinte erro quando o chaveiro é consultado e a ferramenta volta a solicitar na linha de comando:
** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon
A investigação revela que o problema básico é que o gnome-keyring-daemon está esperando que as conexões usem o dbus para falar com ele. O dbus não é iniciado se não houver sessão X11, portanto, não há barramento dbus comum para o gnome-keyring-daemon e libgnome-keyring se conectarem.
Encontrei duas soluções que outras pessoas postaram para esse problema, embora nenhuma delas funcione corretamente para mim.
- Obtenha uma porta DBUS de uma sessão existente que usa X11
- Iniciar manualmente uma nova porta DBUS
Ao conectar a uma porta DBUS existente, o conceito básico é encontrar o PID de uma sessão de login existente, despejar o ambiente para esse PID do procfs, procurá-lo DBUS_SESSION_BUS_ADDRESS
e exportá-lo no ambiente atual. Como esta é a variável usada para publicar o barramento DBUS sendo usado por tudo nas sessões, definir isso deve permitir que tudo na sessão se comunique em um barramento DBUS comum, embora seja o barramento associado a uma sessão diferente.
Fontes aqui:
https://ubuntuforums.org/showthread.php?t=1059023
https://ask.fedoraproject.org/en/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh- sessão/
Código adicionado ao meu .bashrc sendo executado no 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
O segundo método, iniciar manualmente o DBUS para a sessão, envolve usar dbus-launch
para criar uma nova sessão e definir o DBUS_SESSION_BUS_ADDRESS
ambiente e, em seguida, iniciar o gnome-keyring-daemon com todos os serviços necessários para que ele veja o endereço do barramento DBUS que criamos em vez de um endereço de barramento vazio. Esta solução pode ou não exigir que o gnome-keyring-daemon seja alterado para executar uma instância por sessão em vez de uma instância por sistema, mas não está claro.
Fontes:
Começando com o número 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
Como modificar a linha "Exec" de um serviço dbus sem perder as alterações em caso de atualização
Código adicionado ao meu .bashrc sendo executado no login do 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
Ambas as soluções fornecem o mesmo resultado de falha. Em vez de produzir imediatamente o erro indicando que o gnome-keyring-daemon não pode ser comunicado, o processo trava por um tempo e, em seguida, produz esta saída:
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
Não estou claro sobre como o gnome-keyring-daemon está interagindo com o DBUS, mas está claro a partir do segundo conjunto de resultados de erro que não é acessível por meio de um barramento DBUS recém-criado ou processo cruzado em um barramento DBUS diferente. Algumas das coisas que descobri sugerem que o daemon do chaveiro gnome pode precisar que o DBUS seja iniciado antes dele, mas não está claro se esse é o caso do uso (libgnome-keyring) ou do daemon.
Como faço isso funcionar?