154

Linux 環境では、ソケットへの RJ45 コネクタの物理的な接続状態または切断状態を検出する必要があります。できれば、BASH スクリプトのみを使用してください。

他のサイトで提案されている次の解決策は、この目的には機能しません。

  1. 「ifconfig」を使用 - ネットワーク ケーブルが接続されている可能性がありますが、ネットワークが適切に構成されていないか、現在稼働していないためです。
  2. ホストに ping を実行します。これは、製品が未知のネットワーク構成と未知のホストを使用する LAN 内にあるためです。

/proc ファイル システムで使用できる状態はありませんか (他のすべてはそこにあります)。

Linux の世界では、ネットワーク ケーブルを抜いたばかりであることを示す独自のバージョンの Windows バブルがアイコン トレイから飛び出すのはどうしてだと思いますか?


Kent Fredriclothar、あなたの答えはどちらも私のニーズを満たしています...どうもありがとう!どれを使うか……まだわからない。

お二人とも正解にはならないのでしょうか?そして、私が1つを選択することは、おそらくあなたにとって公平です. 私が推測するコインを投げますか?もう一度、ありがとう!

4

16 に答える 16

241

のノードを見たい

/sys/クラス/ネット/

私は自分で実験しました:

ワイヤーが差し込まれています:

eth0/carrier:1
eth0/operstate:unknown

ワイヤーが取り除かれました:

eth0/carrier:0
eth0/operstate:down

ワイヤーが再び差し込まれました:

eth0/carrier:1
eth0/operstate:up

裏技: 簡単な方法ですべてのプロパティを一度に収集する:

grep "" eth0/* 

key:valueこれにより、ペアの優れたリストが形成され ます。

于 2009-04-30T19:17:51.647 に答える
91

ethtoolを使用できます。

$ sudo ethtool eth0
Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: umbg
    Wake-on: g
    Current message level: 0x00000007 (7)
    Link detected: yes

リンク ステータスのみを取得するには、grep を使用できます。

$ sudo ethtool eth0 | grep Link
    Link detected: yes
于 2009-04-30T19:17:07.797 に答える
27

「ip monitor」を使用して、リアルタイムのリンク状態の変化を取得します。

于 2012-09-05T21:13:07.717 に答える
18

cat /sys/class/net/ethX最も簡単な方法です。

ただし、インターフェイスがアップしている必要があります。そうしないと、無効な引数エラーが発生します。

最初に:

ifconfig ethX up

それで:

cat /sys/class/net/ethX
于 2011-11-01T14:51:36.137 に答える
9

低レベルでは、これらのイベントは、ポーリングなしでrtnetlinkソケットを使用してキャッチできます。補足: rtnetlink を使用する場合は、udev と連携する必要があります。そうしないと、udev が新しいネットワーク インターフェイスの名前を変更するときに、プログラムが混乱する可能性があります。

シェル スクリプトを使用してネットワーク構成を行う際の問題は、シェル スクリプトがイベント処理(ネットワーク ケーブルの抜き差しなど) に対応できないことです。より強力なものが必要な場合は、ネットワーク構成用に設計されたプログラミング言語である私のNCD プログラミング言語をご覧ください。

たとえば、「cable in」と「cable out」を stdout に出力する単純な NCD スクリプトの例を示します (インターフェイスが既に起動していると仮定します)。

process foo {
    # Wait for device to appear and be configured by udev.
    net.backend.waitdevice("eth0");
    # Wait for cable to be plugged in.
    net.backend.waitlink("eth0");
    # Print "cable in" when we reach this point, and "cable out"
    # when we regress.
    println("cable in");   # or pop_bubble("Network cable in.");
    rprintln("cable out"); # or rpop_bubble("Network cable out!");
                           # just joking, there's no pop_bubble() in NCD yet :)
}

(内部でnet.backend.waitlink()は、rtnetlink をnet.backend.waitdevice()使用し、udev を使用します)

NCD の考え方は、ネットワークを構成するためだけに使用するというもので、通常は次のような構成コマンドが間に入ります。

process foo {
    # Wait for device to appear and be configured by udev.
    net.backend.waitdevice("eth0");
    # Set device up.
    net.up("eth0");
    # Wait for cable to be plugged in.
    net.backend.waitlink("eth0");
    # Add IP address to device.
    net.ipv4.addr("eth0", "192.168.1.61", "24");
}

注意すべき重要な部分は、実行が後退できることです。たとえば、2 番目の例では、ケーブルが引き抜かれると、IP アドレスが自動的に削除されます。

于 2011-11-01T15:25:10.450 に答える
4

このコマンドを使用して、ワイヤが接続されていることを確認します。

cd /sys/class/net/
grep "" eth0/operstate

結果が上がるか下がるか。不明と表示される場合があるので、確認する必要があります

eth0/carrier

0または1を示します

于 2014-08-19T05:59:54.303 に答える
3

最新の Linux ディストリビューションのほとんどは、これにNetworkManagerを使用しています。D-BUS を使用してイベントをリッスンできます。

コマンドライン ツールでステータスを確認する場合mii-toolは、イーサネットを念頭に置いている場合は、 も使用できます。

于 2009-04-30T19:16:30.903 に答える