Scripts de inicialização invocando scripts no diretório de um usuário - não funcionando (Ubuntu 18.04)

1

Eu quero iniciar automaticamente o proxy de túneis e socks de e-mail no momento da inicialização. Eu tenho um script /etc/init.d/email-tunnels que invoca outro script no meu diretório pessoal. Ele não funcionará no momento da inicialização, não funcionará se eu executar sudo service email-tunnels start , mas funcionará se eu apenas executá-lo, sudo /etc/init.d/email-tunnels start . BTW, eu tenho uma configuração idêntica em outra máquina (Debian 8), e funciona como um encanto sobre isso.

Estes são os detalhes (da configuração do Ubuntu 18, aquela que não está funcionando):

[···]$ ls -lh /etc/init.d/email-tunnels 
-rwxr-xr-x 1 root root 602 Aug 28 10:21 /etc/init.d/email-tunnels
[···]$

O conteúdo é (incluindo alguma depuração echo s):

[···]$ cat /etc/init.d/email-tunnels 
#! /bin/sh

### BEGIN INIT INFO
# Provides:     email_tunnels
# Required-Start:   $all
# Required-Stop:    $remote_fs $syslog
# Default-Start:    2 3
# Default-Stop:     0 1 6
# Short-Description:    E-mail and HTTP tunnels over SSH
### END INIT INFO

echo "email-tunnels invoked at 'date'" >> /tmp/email-tunnels.log

touch /var/lock/email-tunnels

case "$1" in
  start)
    echo "email-tunnels executing 'start' at 'date'" >> /tmp/email-tunnels.log
    su -c "/home/cal/bin/email.sh &" cal
    ;;
  stop)
    ;;
  *)
    echo "Usage: /etc/init/email-tunnels {start|stop}"
    exit 1
    ;;
esac

exit 0

E depois, meu script no meu diretório pessoal:

[···]$ ls -lh /home/cal/bin/email.sh 
-rwxr-xr-x 1 cal cal 410 Aug 28 10:09 /home/cal/bin/email.sh
[···]$ 

E seu conteúdo:

[···]$ cat /home/cal/bin/email.sh 
#!/bin/bash

echo "email.sh executed at 'date'" >> /tmp/email.log
sleep 30

while [ "1" == "1" ]
do
    echo "email.sh about to execute ssh at 'date'" >> /tmp/email.log
    ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25 [email protected]
    sleep 120
done

O usuário dos túneis na minha máquina de destino (servidor) tem a autenticação PK configurada corretamente, para que eu possa conectar ssh sem qualquer interação do usuário (sem ter que fornecer uma senha).

Alguma idéia de por que não está funcionando? Da saída de depuração, vejo que o script init.d (email-tunnels) é executado (vejo a saída em /tmp/email-tunnels.log), mas não o /home/cal/bin/email.sh - - quando eu executo manualmente o /etc/init.d/email-tunnels start , então vejo a saída de depuração do /tmp/email.log, e os túneis funcionam depois que eu corri.

    
por Cal-linux 28.08.2018 / 17:47

1 resposta

3

Você está usando o Ubuntu Linux, um sistema operacional que tem sido um sistema operacional systemd desde 2016 e foi um sistema operacional Upstart por uma década antes disso, desde 2006. van Smoorenburg rc scripts não são o caminho, especialmente para novos coisas.

E especialmente neste caso. Isso é quase um candidato para o House of Horror . Em seu sistema, uma unidade de serviço gerada está executando um processo para interpretar um script, que bifurca um processo para executar su (abusando dele para descartar privilégios), que bifurca um processo para executar um shell, que bifurca um processo para interpretar outro script , que executa um supervisor do Daemon de Poor Man do loop infinito que bifurca repetidamente ssh .

E tudo isso apenas para fazer o que um gerente de serviços pode fazer de qualquer maneira : executar um programa específico como um usuário específico e reiniciá-lo toda vez que ele sair.

Aprenda journalctl -b para ler os registros e aproveite essa base simples:

# /etc/systemd/system/email_tunnels.service
[Unit]
Description=E-mail and HTTP tunnels over SSH
Documentation=https://unix.stackexchange.com/a/465353/5132

[Service]
User=cal
Type=simple
ExecStart=/usr/bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25 [email protected]
RestartSec=120

[Install]
WantedBy=multi-user.target

Em seguida, você só precisa garantir que este serviço seja executado depois que seu diretório pessoal, contendo seus arquivos de identidade SSH, estiver disponível. Claro, com algumas configurações, este é apenas o caso após você ter logado e seu diretório pessoal ter sido montado, descriptografado e outros. Nesse caso, você também pode não configurar um serviço em nível de sistema em todos e, em vez disso, executá-lo como um serviço de usuário sob sua instância por usuário do systemd, que é iniciada no primeiro login:

# /home/cal/.config/systemd/user/email_tunnels.service
[Unit]
Description=E-mail and HTTP tunnels over SSH
Documentation=https://unix.stackexchange.com/a/465353/5132

[Service]
Type=simple
ExecStart=/usr/bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25 [email protected]
RestartSec=120

[Install]
WantedBy=default.target

Use a opção --user para systemctl para controlar esse serviço por usuário, é claro.

Leitura adicional

por 28.08.2018 / 19:27