/etc/rc.localスクリプトを実行する前にインターネット接続を確認するにはどうすればよいですか


8

Raspberry PiをVPNゲートウェイとして使用したい。RPiは私のホームネットワークに接続し、wlan0, and接続されている任意のデバイスを介してインターネットeth0がVPN接続を取得します。私はpptp-linuxVPN接続を確立するために使用しており、プロトタイピングの段階ですべてがうまくいきました。ただし、プロジェクトを完了する/etc/rc.localために、起動時にVPN接続が開始されるようにスクリプトにVPN接続を配置しました。今では50%の確率で失敗します。経由でインターネットに正しく接続する前に、VPN接続を試みているのではないかと思いますwlan0。これが問題である場合rc.localは、スクリプトの残りの部分に進む前に、最初に有効なインターネット接続をテストする必要があります。これをどのように行うことができるかについてのアイデアはありますか?


sleep 20スクリプトの前にを追加できます。または、スクリプトをに配置します/etc/network/if-up.d。この方法では、ネットワークインターフェイスが起動するとスクリプトが実行されます。
Gerben 2013年

回答:


7

このStackOverflowの回答から。

ローカルゲートウェイにpingを実行します。

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

4

私の頭の真上から:

  1. ルーターにping

  2. ping google.com

  3. ifconfig有効なゲートウェイおよび/または有効なIPアドレスのgrep 出力


grep有効な応答を得るには、pingを実行する必要があります。すべての条件が満たされるまでwhileループで。pingを実行するだけではあまり効果がありません。Jivingsは優れたコード行を引用しています。
Piotr Kula 2013年

@ppumkinを使用する必要はありません。ping grepは、終了コードを使用して結果を通知します。ping -qc 1 192.168.1.1 && echo ok || echo error
たとえば

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はupstartを使用するようになりました。これはおそらく、init.dスクリプトよりもはるかに簡単な方法です。

待機するためにいくつかの異なるサービスを試す必要があるかもしれませんが、networking(もしあれば)またはnetwork-manager最初に試すのに良いサービスかもしれません。

これはUbuntu用ですが、あまり多くの違いを見つけるべきではありませんhttp://upstart.ubuntu.com/cookbook/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.