Как я могу проверить подключение к интернету перед запуском скрипта /etc/rc.local?

8

Я хочу использовать Raspberry Pi в качестве VPN-шлюза. RPi подключается к моей домашней сети, а Интернет через wlan0, andлюбое подключенное устройство eth0получает VPN-подключение. Я использую, pptp-linuxчтобы установить VPN-соединение, и все работало нормально на этапе создания прототипа. Однако, чтобы завершить проект, я поставил VPN-соединение в /etc/rc.localсценарии, чтобы оно запускалось при загрузке. Теперь это терпит неудачу 50% времени. Я подозреваю, что он пытается установить VPN-соединение, прежде чем я правильно подключусь к Интернету через wlan0. Если это проблема, мне нужно проверить правильность подключения к Интернету в начале, rc.localпрежде чем продолжить работу с остальным сценарием. Есть идеи, как я могу это сделать?

user7848
источник
Вы можете добавить sleep 20перед вашим сценарием. Или лучше, вставьте свой сценарий /etc/network/if-up.d. Таким образом, скрипт запускается, когда сетевой интерфейс запускается.
Гербен

Ответы:

4

прямо с макушки моей головы:

  1. пинг вашего роутера

  2. пинг google.com

  3. ifconfigвывод grep для действительного шлюза и / или действительного IP-адреса

Lenik
источник
Вам нужно grepпинг для правильного ответа. Через некоторое время пока все условия не будут выполнены. Просто пинг не будет делать много. Дживингс процитировал хорошую строку кода.
Петр Кула
@ppumkin не нужно использовать grep, ping использует коды выхода, чтобы сообщить вам о результатах, что-то вродеping -qc 1 192.168.1.1 && echo ok || echo error
lenik
4

На основе примера кода Jivings и моей собственной логики.

#!/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...

Правильным способом было бы создать функцию, которая возвращает логическое значение для компаратора while. но так должна выглядеть логика оболочки.

Петр Кула
источник
1

Debian теперь использует выскочку. Это, вероятно, гораздо более простой способ сделать это, чем сценарии init.d.

Возможно, вам придется попробовать несколько разных служб, чтобы подождать, но networking(если они есть) или, network-managerвозможно, стоит попробовать их в первую очередь.

Это для Ubuntu, но вы не должны найти слишком много различий http://upstart.ubuntu.com/cookbook/

KayEss
источник