Meu caso de uso é que eu tenho um servidor sem cabeça no qual o desenvolvimento de software é realizado. Normalmente, habilito o encaminhamento do X11 para as conexões SSH, mas não posso para locais distantes com conexões lentas.
Preciso de armazenamento e armazenamento em cache seguros para minhas credenciais git, pois trabalho regularmente com repositórios 18 a 20 em uma árvore, por isso estou usando git-credential-gnome-keyring como o git credential.helper, que se comunica usando o libgnome-keyring ao gnome-keyring-daemon. Para testar soluções, configurei um PC com um monitor, confirmei o chaveiro trabalhado por padrão no sistema e tentei com o SSH. Ele funciona com o encaminhamento do X11, mas não funciona sem ele.
Quando estou conectado sem o encaminhamento do X11, o seguinte erro ocorre quando o chaveiro é consultado e a ferramenta volta a ser solicitada 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 espera que as conexões usem o dbus para conversar com ele. O dbus não é iniciado se não houver sessão X11, portanto, não há um barramento dbus comum para o gnome-keyring-daemon e o libgnome-keyring ao qual se conectar.
Encontrei duas soluções que outras pessoas postaram para esse problema, embora nenhuma delas funcione corretamente para mim.
- Obter uma porta DBUS de uma sessão existente que usa o X11
- Iniciar manualmente uma nova porta DBUS
Ao conectar-se a uma porta DBUS existente, o conceito básico é encontrar o PID de uma sessão de logon existente, despejar o ambiente para esse PID a partir dos procfs, procurá-lo DBUS_SESSION_BUS_ADDRESS
e exportá-lo no ambiente atual. Como essa é a variável usada para publicar o barramento DBUS que está sendo usado por tudo nas sessões, a configuração 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- session /
Code 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 o uso dbus-launch
para criar uma nova sessão e definir o DBUS_SESSION_BUS_ADDRESS
ambiente, iniciando 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 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 dão o mesmo resultado com 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 depois 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 como o gnome-keyring-daemon está interagindo com o DBUS, mas é claro que, a partir do segundo conjunto de erros, ele não pode ser acessado por um barramento DBUS recém-criado ou por um processo cruzado em um barramento DBUS diferente. Algumas das descobertas sugerem que o gnome-keyring-daemon pode precisar do DBUS iniciado antes dele, mas não está claro se esse é o caso do uso (libgnome-keyring) ou do daemon.
Como faço para isso funcionar?