Script Bash para abrir o túnel reverso do SSH na inicialização

0

Estou tentando executar um script na inicialização de uma máquina Debian Jessie, entre outras coisas, cria um túnel reverso de SSH.

O problema é que coloquei este script em if-up e em rc.local para iniciar a partir de. Todos os outros trabalhos funcionam bem, mas quando é necessário criar o túnel SSH, ele não consegue criá-lo ou suspende a inicialização em uma tarefa que está executando a mensagem.

Eu ficaria mais claro, mas o problema é que, se eu executar /etc/rc.local depois que a máquina inicializar, o túnel estará funcionando perfeitamente.

Eu tenho que acrescentar que a máquina para a qual o túnel é criado é um Raspberry Pi e às vezes eu não consigo ssh até fazer alguns pings. Eu gerenciei o script para fazer isso, mas não obtive sucesso na inicialização.

Como você pode ver, eu não sou experiente, apenas aprendendo.

edit: Obrigado. Como eu estou dizendo antes, o código funciona perfeito se eu iniciá-lo a partir do console. Eu dou permissões completas (777) para todos, apenas no caso e para testes. O script tem a execução ativada, mas apenas um chmod + x, talvez algo mais seja necessário ... aqui está o código. Como eu disse o script na máquina remota pede ip's privados e públicos e os coloca em um banco de dados rpi, depois ele inicia um tunelamento reverso (ou não) Lança ele de /etc/rc.local e o script é armazenado em / usr / local / games

#!/bin/bash
   wget -q --tries=10 --timeout=20 --spider http://google.com
   if [[ $? -eq 0 ]]; then

    publica=$(curl http://ipecho.net/plain)

    sleep 0.25s

    privada1= while IFS=$': \t' read -a line ;do

    [ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
    [ "${ip#127.0.0.1}" ] && privada1=$ip

  done< <(LANG=C /sbin/ifconfig)


    fecha=$(date +%F_%X)


    sleep 0.15

    nombre=$(hostname)

       sleep 0.15s

 curl --data "nombre=$nombre&fecha=$fecha&publica=$publica&privada1=$privada1&privada2=$privada2&privada3=$privada3&privada4=$privada4&press=envia" http://www.xxxxxxxxx.xx/xxx.php


 while [[ $(autossh -p xxxx -R 10101:localhost:22 [email protected] -fN) -ne 0 ]]; do

     ping -c3 xxxxxxxxx.xx

       if ($? -eq 0) then
       autossh -p xxxx  -R 10101:localhost:22 [email protected] -fN;
      else
     ping -c3 xxxxxx.xxx
     fi  
  done
  else bash -x /etc/rc.local 

  fi

exit 0
    
por dedosoa 13.10.2016 / 11:19

2 respostas

1

Experimente este script:

#!/bin/bash
remote_host=rpi.local
remote_port=10022
local_port=22
cmd="ssh -fN -R ${remote_port}:localhost:${local_port} ${remote_host}"

while true; do
    pgrep -fx "$cmd" >/dev/null 2>&1 || $cmd
    sleep 10
done

Notas:

  • Ajuste o host remoto e as portas conforme necessário.

  • O script constrói uma linha de comando ssh completa em cmd .

  • O script repetidamente (a cada 10 segundos) verifica se um processo existe executando a linha de comando exata e, se não, inicia um.

  • O ssh será executado em segundo plano devido a -f .

  • Invoque o script em /etc/rc.local .

  • Para eliminar o túnel, primeiro mate o script e, em seguida, o processo ssh .

  • É desnecessário dizer que você precisa de senhas sem senha para que isso funcione.

por 13.10.2016 / 20:57
0

OK, então para alguém que está preso neste ponto ou algo assim. Graças a um amigo, ele me deu a pista. O rc.local lança scripts como root. então o comando para iniciar o túnel ssh, autossh no meu caso, tem que ser lançado como outro usuário.

Tornar o sudo -u "youruser" fará o trabalho.
Obrigado a todos.

    
por 18.11.2016 / 10:07