web-dev-qa-db-ja.com

インターフェースeth0が起動しているかどうかを確認します(構成済み)

eth0が構成されているかどうかをスクリプトで確認する必要があります。その場合、スクリプトは何もしません。それ以外の場合はwlan0で始まります。 (eth0wlan0の両方が同時に起動することは望ましくありません)。

eth0がすでに稼働しているかどうかを確認する最も簡単な方法は何ですか?

私はDebian Wheezyを使用しています

明確化:

eth0のケーブルが接続されていることだけでなく、インターフェースが構成されていること(つまり、静的IPが設定されているか、DHCP IPを受信して​​いること)を確認したいと思います。ケーブルは差し込まれているがeth0が正しく構成されていない場合、wlan0を起動します

31
user1968963

あなたはそれを多くの方法で行うことができます。ここに例を示します:

$ cat /sys/class/net/eth0/operstate
up
48
cuonglm
ip a show ethX up

何も表示されない場合は、インターフェースがダウンしています

7
max
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

したがって、ここではgrepユビキタスipツールのstdout対象のインターフェイスとフレーズ "state UP"の両方を含む行の場合(@Lekensteynのおかげで、UPだけではなく、もう少し具体性の必要性を指摘してくれました。)aの省略形として引数addressを使用します。システム内のすべての構成済みネットワークカードのリストを取得するのに十分です。

ipを使用する利点の1つは、どこでも使用できることです。これは、Android phone'sたとえば、ネットワークデバイス。

:colonsは部分一致を回避するために使用されます-このようにして、eth0の一致を保証します他の方法では可能なsomeothereth0またはeth007とは対照的

@RaphaelAhrensが正しいことを理解し、解決策を説明してくれてありがとう。

編集:

現在の要件を処理するには、次のことができます。

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'

上記は、ターゲット$ifUP、接続されており、1つあります。 ipv6の場合、ソリューションは同じように単純で、わずかな変更のみです。

sedが気に入らない場合は、別の|pipe ... grepを使用して同様の結果を達成し、 a-Aコンテキストオプションを最初のgrepに-が好きsed

5
mikeserv

他の方法は機能しませんが、これは機能します(少なくともUbuntuでは):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done
0
xinthose