Loop no rc.local

1. Loop no rc.local

Ailton Silva
kidsaqua

(usa Slackware)

Enviado em 15/01/2016 - 21:30h

Boa noite. Estou trabalhando num projeto e estou usando o slack arm. Tudo estava indo bem. Eu precisava criar um tunel reverso toda vez que slack fosse iniciado. Coloquei o comando ssh no rc.local e funcionou perfeito. Só que se ainternet cair, o tunel é fechado e não refeito. Existe uma maneira de criar um loop pra que o tunel fosse checado a cada 30 segundos e se estivesse fechado o comando seria executado reabrindo o tunel?


  


2. Re: Loop no rc.local

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 15/01/2016 - 21:46h

Usa uma regra de cron pra isso. Primeiro crie um script regra.cron em /usr/local/bin:
#!/bin/bash
# now starts process if it isn't running
if [ ! "$(pidof nomedoprocesso)" ] ; then
nomedoscript
fi

Troque nomedoprocesso pelo nome do programa que chama o túnel, e nomedoscript pelo nome do script que você usa para chamar o túnel no rc.local. Agora rode o comando:
# chmod +x /usr/local/bin/regra.cron 

E depois o comando
$ crontab -e 

ou se você precisar que o túnel seja executado como root:
# crontab -e 

Em todo caso, coloque esse conteúdo no arquivo que o comando abrirá:
# tunnel check, this crontab rule is used to check every 30s if tunnel is running
0,5 * * * * /usr/loca/bin/regra.cron > /dev/null 2>&1

--
Dino®
Vi veri universum vivus vici
Public GPG signature: 0x246A590B
Só Slackware é GNU/Linux e Patrick Volkerding é o seu Profeta


3. Re: Loop no rc.local

Ailton Silva
kidsaqua

(usa Slackware)

Enviado em 15/01/2016 - 22:45h

Não tem nenhum programa que chama o tunel. O comando que eu coloquei no meu rc.local e:
su - user -c "ssh -R xxxx:127.0.0.1:xxxx user@host -N" &
(xxxx são as portas)
Queria que esse comando fosse executado caso o tunel se fechasse se a internet cair.

Eu estava pensando em algo assim:

_LOG="/var/log/tunnel.log"
func_tunel(){
while true; do
echo -e "Tunnel to on port xxxx started at date" >> $_LOG
su - user -c "ssh -R xxxx:127.0.0.1:xxxx user@host -N" & >> $_LOG
echo -e "Tunnel down at date" >> $_LOG
sleep 30
done
}
func_tunnel &

O problema é colocar essa função dentro de um loop...
SEi que deve ser simples, mas não consigui....


4. Re: Loop no rc.local

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 15/01/2016 - 22:58h

kidsaqua escreveu:

Não tem nenhum programa que chama o tunel. O comando que eu coloquei no meu rc.local e:
su - user -c "ssh -R xxxx:127.0.0.1:xxxx user@host -N" &
(xxxx são as portas)
Queria que esse comando fosse executado caso o tunel se fechasse se a internet cair.

Eu estava pensando em algo assim:

_LOG="/var/log/tunnel.log"
func_tunel(){
while true; do
echo -e "Tunnel to on port xxxx started at date" >> $_LOG
su - user -c "ssh -R xxxx:127.0.0.1:xxxx user@host -N" & >> $_LOG
echo -e "Tunnel down at date" >> $_LOG
sleep 30
done
}
func_tunnel &

O problema é colocar essa função dentro de um loop...
SEi que deve ser simples, mas não consigui....


Não vai conseguir porque esse é o jeito errado. Primeiro vamos corrigir uma coisa:
su - user -c "ssh -R xxxx:127.0.0.1:xxxx user@host -N" & 

Meu filho, qualquer coisa que rode pelo rc.local já roda como root, né? O certo é
ssh -R xxxx:127.0.0.1:xxxx user@host -N & 

Se você quer que o túnel se abra quando o usuário fizer login, coloque esse mesmo comando em $HOME/.profile

Agora sim, vamos nós:

1) Como root, crie um arquivo em /usr/local/bin/ chamado regras-tunnel.crontab. Cole o seguinte conteúdo nele:
#!/bin/bash
# now starts process if it isn't running
if [ ! "$(pidof ssh)" ] ; then
ssh -R xxxx:127.0.0.1:xxxx user@host -N
fi

E então rode o comando
# chmod +x /usr/local/bin/regras-tunnel.crontab 


2) Inicie o túnel
Se o túnel for iniciar como root durante a inicialização do sistema, coloque em /etc/rc.d/rc.local a linha:
ssh -R xxxx:127.0.0.1:xxxx user@host -N & 

Se for pro túnel se abrir quando o usuário fizer login, coloque em $HOME/.profile (pode criar o arquivo se ele não existir)
ssh -R xxxx:127.0.0.1:xxxx user@host -N & 


3) Verificar a cada 30s se o túnel está rodando
Se o túnel for iniciar como root, rode o comando
# crontab -e 

Se o túnel for iniciar no login do usuário, rode o comando
$ crontab -e 

Nos dois casos, cole este conteúdo no arquivo que aparecer:
# tunnel check, this crontab rule is used to check every 30s if tunnel is running
0,5 * * * * /usr/loca/bin/regras-tunnel.crontab > /dev/null 2>&1

--
Dino®
Vi veri universum vivus vici
Public GPG signature: 0x246A590B
Só Slackware é GNU/Linux e Patrick Volkerding é o seu Profeta


5. Re: Loop no rc.local

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 15/01/2016 - 23:18h

Em resumo: não use loop pra isso, use o cron que serve exatamente pra esse tipo de treta
--
Dino®
Vi veri universum vivus vici
Public GPG signature: 0x246A590B
Só Slackware é GNU/Linux e Patrick Volkerding é o seu Profeta


6. Re: Loop no rc.local

Ailton Silva
kidsaqua

(usa Slackware)

Enviado em 16/01/2016 - 10:46h

Valeu pela ajuda... Funcionou de forma quase satisfatória.... Ninguem vai estar perto do computador pra logar, por isso que preciso criar um túnel reverso. O túnel tem que abrir no boot, quanto ao comando que vc falou que estava errado é o seguinte, as chaves pública e privada foram geradas como usuário comum, já que o pc pra onde o túnel vai ser feito não aceita login ssh como root, por isso o "su - user -c".

Mas vamos ao novo problema, tenho outras máquinas que fazem o mesmo processo que estou tentando fazer com slack arm, toda vez que o tunel dessas máquinas fecham, as portas usadas por eles tbm fecham.
Isso não está acontecendo com slack arm, toda vez que o tunel fecha, a máquina que vai receber o túnel continua ouvindo na porta, isso impede que o arm se reconect.

Tem como contornar isso?
Obrigado pela ajuda....


7. Re: Loop no rc.local

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 16/01/2016 - 15:21h

Nesse caso, tudo bem. Entretanto, o que pode estar acontecendo é que você esqueceu de um detalhe: o - deve ser a última coisa fornecida ao comando su. Por isso, reescreve o comando para:
su --login user -c "ssh -R xxxx:127.0.0.1:xxxx user@host -N" 

Isso não vai resolver o problema, mas acerta a sintaxe da coisa.

Na máquina que vai receber o túnel você também precisará de uma regra cron, mas dessa vez vai ser para verificar se o túnel continua aberto, e se não estiver deve fechá-lo.
--
Dino®
Vi veri universum vivus vici
Public GPG signature: 0x246A590B
Só Slackware é GNU/Linux e Patrick Volkerding é o seu Profeta


8. Re: Loop no rc.local

Ailton Silva
kidsaqua

(usa Slackware)

Enviado em 27/01/2016 - 20:04h

Muito obrigado pela ajuda, mas acabei não usando a regra cron como vc tinha falado. Usei uma função simples mesmo, como aquela que passei ali em cima. Escrevi direto rc.local e tudo funciona as mil maravilhas. Mas agradeço muito por estar disposto a ajudar.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts