Estou tentando usar o serviço de usuário systemd do agente ssh openssh no Ubuntu 24.04.
A partir do Ubuntu 16.10 em diante, o openssh-client
pacote contém um ssh-agent.service
arquivo de serviço do usuário:
$ lsb_release -sr
No LSB modules are available.
24.04
$ dpkg -S user/ssh-agent.service
openssh-client: /usr/lib/systemd/user/ssh-agent.service
$ systemctl --user cat ssh-agent.service
# /usr/lib/systemd/user/ssh-agent.service
[Unit]
Description=OpenSSH Agent
Documentation=man:ssh-agent(1)
Before=graphical-session-pre.target
ConditionPathExists=/etc/X11/Xsession.options
Wants=dbus.socket
After=dbus.socket
[Service]
# If you need to pass extra arguments to ssh-agent, you can use "systemctl
# --user edit ssh-agent.service" to add a drop-in unit with contents along
# these lines:
# [Service]
# ExecStart=
# ExecStart=/usr/lib/openssh/agent-launch start -- -t 1200
ExecStart=/usr/lib/openssh/agent-launch start
ExecStopPost=/usr/lib/openssh/agent-launch stop
$
Então tentei iniciá-lo, mas ele não está ativo:
$ systemctl --user start ssh-agent.service
$ systemctl --user is-active ssh-agent.service
inactive
$
Depois de alguma pesquisa, configurei a SSH_AUTH_SOCK
variável:
$ ssh myUbuntu-24-04-Server
$ export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/openssh_agent
$ systemctl --user stop ssh-agent.service
$ systemctl --user start ssh-agent.service
$ ls $SSH_AUTH_SOCK
ls: cannot access '/run/user/1000/openssh_agent': No such file or directory
$ systemctl --user is-active ssh-agent.service
inactive
$ systemctl --user status ssh-agent.service
○ ssh-agent.service - OpenSSH Agent
Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; static)
Active: inactive (dead)
Docs: man:ssh-agent(1)
Feb 21 17:41:56 myUbuntu-24-04-Server systemd[118809]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:08:15 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:10:31 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:11:24 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:18:49 myUbuntu-24-04-Server systemd[119442]: Started ssh-agent.service - OpenSSH Agent.
$
Entretanto, este serviço inicia bem em um Ubuntu LTS anterior (22.04):
$ ssh myUbuntu-22-04-Server
$ lsb_release -sr
22.04
$ export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/openssh_agent
$ systemctl --user start ssh-agent.service
$ systemctl --user status ssh-agent.service
● ssh-agent.service - OpenSSH Agent
Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; static)
Active: active (running) since Fri 2025-02-21 18:40:55 CET; 4min 17s ago
Docs: man:ssh-agent(1)
Main PID: 23068 (ssh-agent)
Tasks: 1 (limit: 19005)
Memory: 1.1M
CPU: 6ms
CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/ssh-agent.service
└─23068 ssh-agent -D -a /run/user/1000/openssh_agent
Feb 21 18:40:55 myUbuntu-22-04-Server systemd[22133]: Started OpenSSH Agent.
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23070]: dbus-update-activation-environment: setting SSH_AUTH_SOCK=/run/user/1000/openssh_agent
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23070]: dbus-update-activation-environment: setting SSH_AGENT_LAUNCHER=openssh
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23068]: SSH_AUTH_SOCK=/run/user/1000/openssh_agent; export SSH_AUTH_SOCK;
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23068]: echo Agent pid 23068;
$ ssh-add -l
The agent has no identities.
$
EDIT0: Minha culpa, SSH_AUTH_SOCK
não foi necessário definir a variável manualmente.
Testei novamente no Ubuntu 22.04 e funciona bem sem definir a
SSH_AUTH_SOCK
variável manualmente.
Mas no Ubuntu 24.04, aqui está o que eu recebo:
$ ssh -X myUser@myUbuntu-24-04-Server
myUser@myUbuntu-24-04-Server:~$ echo $XDG_RUNTIME_DIR
/run/user/1000
myUser@myUbuntu-24-04-Server:~$ echo $SSH_AUTH_SOCK
myUser@myUbuntu-24-04-Server:~$ grep use-ssh-agent /etc/X11/Xsession.options
use-ssh-agent
myUser@myUbuntu-24-04-Server:~$ unset SSH_AUTH_SOCK
myUser@myUbuntu-24-04-Server:~$ systemctl --user start ssh-agent.service
myUser@myUbuntu-24-04-Server:~$ systemctl --user status ssh-agent.service
○ ssh-agent.service - OpenSSH Agent
Loaded: loaded (/usr/lib/systemd/user/ssh-agent.service; static)
Active: inactive (dead)
Docs: man:ssh-agent(1)
Feb 21 17:41:56 myUbuntu-24-04-Server systemd[118809]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:08:15 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:10:31 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:11:24 myUbuntu-24-04-Server systemd[119096]: Started ssh-agent.service - OpenSSH Agent.
Feb 21 18:18:49 myUbuntu-24-04-Server systemd[119442]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 17:54:39 myUbuntu-24-04-Server systemd[151016]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 17:56:01 myUbuntu-24-04-Server systemd[151016]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 18:15:38 myUbuntu-24-04-Server systemd[151355]: Started ssh-agent.service - OpenSSH Agent.
Feb 24 18:17:06 myUbuntu-24-04-Server systemd[151355]: Started ssh-agent.service - OpenSSH Agent.
myUser@myUbuntu-24-04-Server:~$ systemctl --user is-active ssh-agent.service
inactive
myUser@myUbuntu-24-04-Server:~$ ssh-add -l
Could not open a connection to your authentication agent.
myUser@myUbuntu-24-04-Server:~$
Pode me ajudar ?
O motivo pelo qual o serviço não está "Ativo" é por vários motivos:
use-ssh-agent
definiu em/etc/X11/Xsession.options
.$SSH_AUTH_SOCK
antes de começarssh-agent.service
.SSH_AUTH_SOCK
também é definido dentro do escopo Systemd --user porgpg-agent-ssh.socket
.Vamos primeiro olhar para o
ssh-agent.service
arquivo unit. Quando a unidade é iniciada, o script/usr/lib/openssh/agent-launch
é chamado pela seguinte linha:Olhando para esse script, temos o seguinte:
Podemos extrair algumas coisas disto:
$XDG_RUNTIME_DIR
precisa ser definido como uma variável de ambiente$SSH_AUTH_SOCK
precisa ser indefinidouse-ssh-agent
precisa ser definido em/etc/X11/Xsession.options
Em seguida, observe a saída de
systemctl --user show-environment
. Isso mostrará suas variáveis de ambiente de escopo Systemd --user:Observe que
SSH_AUTH_SOCK
is defined. Isso impedirássh-agent.service
que essa variável seja iniciada e definida.Quando
ssh-agent
é executado, ele quer definirSSH_AUTH_SOCK
. Citando a página de manual ssh-agent(1) :De qualquer forma, no estado padrão do Ubuntu 24.04,
SSH_AUTH_SOCK
é definido a partir de um arquivo de unidade de soquete chamadogpg-agent-ssh.socket
, e é por isso que ele está disponível no escopo Systemd --user e visível na saída desystemctl --user show-environment
. Dê uma olhada no conteúdo dogpg-agent-ssh.socket
arquivo de unidade e você verá comoSSH_AUTH_SOCK
é definido comExecStartPost=
:A correção
Para habilitar o Ubuntu 24.04,
ssh-agent
você precisa fazer o seguinte:Defina
use-ssh-agent
em/etc/X11/Xsession.options
:Impedir
SSH_AUTH_SOCK
que seja definido no escopo Systemd --user na inicialização porgpg-agent-ssh.socket
. Isso pode ser feito por qualquer uma das seguintes opções:Opção 1:
Crie um
override.conf
arquivo que limpeExecStartPre
,ExecStartPost
,ExecStopPre
, eExecStopPost
com as seguintes etapas:Execute
systemctl --user edit gpg-agent-ssh.socket
para editar e criar umoverride.conf
arquivo. Adicione o seguinte:Salvar e sair.
Em seguida, recarregue as alterações de configuração com
systemctl --user daemon-reload
.Opção 2:
Simplesmente mask
gpg-agent-ssh.socket
. Isso evitará que o socket seja criado.Correr
systemctl --user mask gpg-agent-ssh.socket
.Em seguida, recarregue as alterações de configuração com
systemctl --user daemon-reload
.Desconfigurado
SSH_AUTH_SOCK
no escopo Systemd --user, que foi definido anteriormente comgpg-agent-ssh.socket
o arquivo unit. Você precisa desconfigurar isso antes de iniciarssh-agent.service
:Adicione uma
[Install]
seção em umoverride.conf
arquivo parassh-agent.service
. Isso permitirá que você "habilite" o serviço e o faça iniciar na inicialização.Em seguida, recarregue as alterações de configuração com
systemctl --user daemon-reload
.Habilitar e iniciar
ssh-agent.service
Exportar
SSH_AUTH_SOCK
para.bashrc
que essa variável de ambiente esteja disponível globalmente. Caso contrário,ssh-add
não verá um socket disponível, pois não pode ver as variáveis de escopo Systemd --user.Adicione o seguinte ao final de
.bashrc
:export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/openssh_agent"
Então recarregue
.bashrc
:Após a configuração acima:
Você terá uma
SSH_AUTH_SOCK
variável global:Isso corresponderá à variável de escopo --user do Systemd:
ssh-agent
será habilitado e ativo (em execução):A saída de
ssh-add -l
não apresentará erro: