Como posso verificar a conexão à Internet antes de executar o script /etc/rc.local

8

Quero usar o Raspberry Pi como um gateway de VPN. O RPi se conecta à minha rede doméstica e a Internet por wlan0, andqualquer dispositivo conectado eth0obtém uma conexão VPN. Estou usando pptp-linuxpara fazer a conexão VPN e tudo funcionou bem durante meu estágio de prototipagem. No entanto, para concluir o projeto, coloquei a conexão VPN no /etc/rc.localscript para que inicie na inicialização. Agora ele falha 50% do tempo. Eu suspeito que ele esteja tentando a conexão VPN antes de eu estar conectado corretamente à Internet via wlan0. Se esse for o problema, preciso de um teste para uma conexão à Internet válida no início de rc.localantes de prosseguir com o restante do script. Alguma idéia de como eu poderia fazer isso?

user7848
fonte
Você pode adicionar um sleep 20antes do seu script. Ou melhor, coloque seu script /etc/network/if-up.d. Dessa forma, o script é executado quando a interface de rede é ativada.
Gerben

Respostas:

7

A partir desta resposta StackOverflow ;

Faça ping no gateway local;

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
Jivings
fonte
4

bem em cima da minha cabeça:

  1. sibile seu roteador

  2. sibile google.com

  3. ifconfigsaída grep para gateway válido e / ou endereço IP válido

lenik
fonte
Você precisaria grepdos pings para uma resposta válida. Em um loop while, até que todas as condições sejam atendidas. Apenas o ping não fará muito. Jivings citou uma boa linha de código.
Piotr Kula
@ppumkin há necessidade de uso grep, de ping usa códigos de saída para informá-lo sobre os resultados, algo comoping -qc 1 192.168.1.1 && echo ok || echo error
lenik
4

Baseado no código de exemplo de Jivings e em algumas de minhas próprias lógicas.

#!/bin/bash

STATE="error";

while [  $STATE == "error" ]; do
    #do a ping and check that its not a default message or change to grep for something else
    STATE=$(ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error)

    #sleep for 2 seconds and try again
    sleep 2
 done

#put your VPN code here...

A maneira correta seria criar uma função que retorne um booleano no comparador while. mas é assim que a lógica do shell deve se parecer.

Piotr Kula
fonte
1

O Debian agora usa upstart. Essa é provavelmente uma maneira muito mais simples de fazer isso do que o script init.d.

Pode ser necessário tentar alguns serviços diferentes para aguardar, mas networking(se houver) ou network-managerpode ser bom tentar primeiro.

Isso é para o Ubuntu, mas você não deve encontrar muitas diferenças http://upstart.ubuntu.com/cookbook/

KayEss
fonte