Estabelecendo túneis SSH reversos via systemd

3

No momento, estou portando todas as configurações do meu crontab para o systemd-services, ou seja, criando unidades para tarefas que precisam ser iniciadas automaticamente em meus computadores.

Uma dessas unidades está me dando dor de cabeça. Eu chamei de "uplink.service", o seu propósito é chamar um script que construa um túnel ssh reverso para o meu servidor e estabeleça isso. Esta é a unidade que criei:

[Unit]
Description = SSH-Uplink
After = network.target

[Service]
ExecStart = /bin/bash /root/script/uplink.sh

[Install]
WantedBy = multi-user.target

Este é o script para o qual a unidade aponta:

ssh -fNC -R XXXX:localhost:22 user@ip -pXXXX -i ~/script/id_rsa
touch /tmp/uplinkonline

Como você pode ver, para depurar este script, tente criar um novo arquivo chamado uplinkonline em / tmp. Isso funciona; o arquivo é criado depois de iniciar o serviço, então o script em si é chamado com sucesso.

E esta é a saída do systemctl após tentar iniciá-lo:

uplink.service - SSH-Uplink
   Loaded: loaded (/etc/systemd/system/uplink.service; disabled; 
vendor preset: disabled)
   Active: inactive (dead)

Nov 07 10:44:01 loki systemd[1]: Started SSH-Uplink.

O próprio script funciona ao iniciar manualmente ou ao chamá-lo pela inicialização via crontab. Mas de alguma forma o systemd parece esperar um comportamento diferente e sai, sem iniciar a conexão SSH. Onde eu errei?

    
por t3ngu 07.11.2018 / 11:57

1 resposta

4

Seu script inicia ssh em segundo plano e não fica por perto, enquanto o systemd espera que os programas que ele executa permaneçam em execução enquanto o serviço está ativo.

Tudo o que você precisa fazer é dizer ao systemd que este é um serviço único, configurando-o com Type=oneshot na unidade de serviço. Você também pode querer incluir RemainAfterExit=yes para que o systemd continue listando o serviço como "up".

Em suma, atualize seu arquivo de serviço para o seguinte:

[Unit]
Description=SSH-Uplink
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/bash /root/script/uplink.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

(Note que o estilo usual para arquivos unitários systemd não possui espaços ao redor dos "=" s, então eu consertei isso também.)

Você pode querer considerar a adição de um comando ExecStop= para derrubar o túnel SSH, a fim de tornar systemctl stop uplink funcionando conforme o esperado.

    
por 07.11.2018 / 15:37