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


8

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


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

Ответы:



4

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

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

  2. пинг google.com

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


Вам нужно 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/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.