Fazendo uma conexão SSR invertida crontab usando script

6

Eu tenho um PC atrás de um NAT que faz uma conexão SSH reversa com o meu VPC Digitalocean. Eu utilizo esta conexão SSH invertida em casa para fazer o login no PC do meu escritório (estou autorizado a fazê-lo) e copio arquivos e faço outras coisas importantes.

Embora não seja frequente, notei que o PC do meu escritório reinicia (devido a falhas de energia, etc.) e interrompe a conexão SSH invertida que ele fez com o meu VPC. Nesse tipo de casos, não consigo me conectar do meu PC doméstico ao meu PC do escritório.

Eu corro o seguinte script para fazer a conexão reversa + proxy dinâmico anonimizar meu tráfego (como não sou necessário para compartilhar informações de navegação) gerado no PC do escritório.

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

Não há nenhuma maneira de executar esse script novamente no PC do meu escritório quando reiniciar, pois não estou fisicamente lá. Para resolver este problema, instalei o seguinte crontab.

Nota: o arquivo rev.sh contém a linha acima. O certificado "digitalOcean" e rev.sh estão localizados em Ubuntu home . Portanto, quando executo ./rev.sh no meu terminal Ubuntu, obtenho um proxy dinâmico e também acesso ao meu servidor DigitalOcean. Este método funciona 100%.

No entanto, quando eu instalo o crontab no seguinte método, o My ubuntu PC nunca faz um proxy dinâmico. Eu posso ver isso porque quando eu verificar este proxy do Google Chrome, ele diz que o proxy está recusando a conexão.

Aqui estão os cronjobs que eu tentei como cronjobs do root. Eu também tentei isso como um usuário normal, mas eles não funcionaram.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Eu então instalei um crontab vários minutos antes do tempo atual e esperei que ele fosse executado.

24 12 * * * bash /home/user/rev.sh
24 12 * * * /home/user/rev.sh
24 12 * * * reboot 

Estes também não executaram.

Eu também tentei 48 15 * * * bash /home/user/rev.sh >> test3 e */1 * * * * reboot -f >> test , mas o test3 e o teste não têm nada. No entanto, os arquivos foram criados !! pelo crontab!

Por favor, seja gentil o suficiente para me ajudar a identificar o meu erro. Há muitas perguntas semelhantes neste site sobre o meu problema. Eu já mencionei muitas respostas, mas nenhuma delas pareceu ajudar.

    
por Dina 17.11.2016 / 10:04

1 resposta

2

Uma solução melhor seria usar o watchdog. O watchdog é um daemon que assistirá aos processos em execução e, se eles saírem, os reiniciará automaticamente.

Instale o watchdog no Ubuntu 16.04

sudo apt-get install watchdog

Como funciona o watchdog

O daemon watchdog(8) executará scripts em /etc/watchdog.d com o argumento test ou repair . (veja TEST DIRECTORY seção da watchdog(8) man page ). Seu script de watchdog lida com esses dois argumentos quando verifica se um processo está em execução e executa uma ação para repará-lo.

Você pode configurar o watchdog modificando /etc/watchdog.conf (veja watchdog.conf(5) ).

Exemplo de watchdog.d script

Tome por exemplo /etc/watchdog.d/autossh_script (que tem 755 permissões e é de propriedade de root ).

  

Nota: você pode precisar personalizar a variável de ambiente $targetuser no script de exemplo. sam é meu nome de usuário.

#!/bin/bash

targetuser=sam

runTest=false
runRepair=false

case  in
  test)
    runTest=true
  ;;
  repair)
    runRepair=true
    repairExitCode=
  ;;
  *)
    echo 'Error: script needs to be run by watchdog' 1>&2
    exit 1
  ;;
esac

if ${runTest}; then
  #run a test here which will tell the status of your process
  #the exit code of this script will be the repairExitCode if it is non-zero
  if ! pgrep autossh &> /dev/null; then
    #autossh not running; notify watchdog to repair
    exit 1
  else
    #autossh running; no action necessary
    exit 0
  fi
fi

if ${runRepair}; then
  #take an action to repair the affected item
  #use a case statement on $repairExitCode to handle different failure cases
  su - ${targetuser} -c 'nohup autossh -f -- -NCD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC'
  exit 0
fi
  • Eu adicionei -N ao seu comando ssh no script de exemplo para que ele apenas inicie o encapsulamento, mas não tente criar um shell de login.
  • Eu adicionei -f a autossh para que ele seja executado em segundo plano.
  • O script de exemplo usa um padrão simples pgrep . No entanto, você pode restringir ainda mais o teste a um usuário específico ou até mesmo usar um padrão para o processo. Consulte pgrep(1) para saber como personalizar ainda mais seu teste usando pgrep.

Configurando o watchdog

/etc/watchdog.conf e /etc/defaults/watchdog são locais para configurar o watchdog. Veja watchdog.conf(5) .

Uma coisa a notar é que os scripts do usuário são executados uma vez a cada segundo por padrão. Eu recomendo aumentar isso para pelo menos 30 segundos, a menos que você precise de mais verificações em tempo real. Ajuste a configuração interval em watchdog.conf .

Resolução de problemas

Você pode precisar criar o diretório /etc/watchdog.d antes do seu script.

/var/log/watchdog/* contém logs e erros relacionados ao watchdog. Se o seu script for gerado para stdout ou stderr, ele será gravado lá. No meu sistema, percebo que meu script executa test ou repair aproximadamente uma vez a cada segundo. Se você usar echo em seu script, ele deverá ser temporário apenas para fins de depuração. Caso contrário, recomenda-se descartar a saída, exceto no caso de erros.

Se o seu script não estiver sendo executado, verifique as permissões: ls -l /etc/watchdog.d .

    
por Sam Gleske 29.11.2016 / 02:40