質問

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

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

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

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

Linuxの世界では、アイコントレイからポップアップする独自のバージョンのWindowsバブルがあり、ネットワークケーブルを取り外したばかりであることを示しています。


Kent Fredric lothar 、あなたの答えは両方とも私のニーズを満たします。どうもありがとう!どちらを使用するか...まだわかりません。

私はあなたの両方を正しい答えとして置くことはできないと思いますか?そして、おそらくあなたのために私が1つを選ぶことは公平です。コインを裏返す?繰り返します、ありがとう!

役に立ちましたか?

解決

ノードを見てみたい

/sys/class/net/

私の実験:

Wire Plugged in:

eth0/carrier:1
eth0/operstate:unknown

ワイヤーの削除:

eth0/carrier:0
eth0/operstate:down

ワイヤーが再び接続されました:

eth0/carrier:1
eth0/operstate:up

サイドトリック:簡単な方法ですべてのプロパティを一度に収集する:

grep "" eth0/* 

これは、 key:value ペアの素晴らしいリストを形成します。

他のヒント

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

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

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

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

最初に:

ifconfig ethX up

その後:

cat /sys/class/net/ethX

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

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

たとえば、「ケーブルイン」を印刷する単純なNCDスクリプトおよび「ケーブルアウト」 stdoutに(インターフェイスが既に起動していると仮定):

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アドレスは自動的に削除されます。

これらのイベントを検出する2つのデーモンが存在します:

ifplugd および netplugd

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

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

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

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

結果がアップまたはダウンする場合。不明な場合があります。確認する必要があります

eth0/carrier

0または1を示しています

いくつかの精度とトリック

  1. これはすべて通常のユーザーとして( root ではなく)

  2. dmesg

    から情報を取得する

    dmesg を使用することは、システムの現在の状態を照会する最初のことの1つです。

    dmesg | sed '/eth.*Link is/h;${x;p};d'
    

    次のように回答できます:

    [936536.904154] e1000e: eth0 NIC Link is Down
    

    または

    [936555.596870] e1000e: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
    

    状態に応じて、メッセージは使用するハードウェアとドライバーによって異なる場合があります。

    注:これは dmesg | grep eth。* Link.is | tail -n1 で記述できますが、 sed を使用することを好みます。

    dmesg | sed '/eth.*Link is/h;${x;s/^.*Link is //;p};d'
    Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
    
    dmesg | sed '/eth.*Link is/h;${x;s/^.*Link is //;p};d'
    Down
    
  3. / sys 擬似ファイルシステムのテスト

    / sys での読み取りまたは書き込みは、特に root として実行している場合、システムを破壊する可能性があります!警告されました;-)

    これはプーリング方法であり、実際のイベント追跡ではありません。

    cd /tmp
    grep -H . /sys/class/net/eth0/* 2>/dev/null >ethstate
    while ! read -t 1;do
        grep -H . /sys/class/net/eth0/* 2>/dev/null |
            diff -u ethstate - |
            tee >(patch -p0) |
            grep ^+
      done
    

    次のようなものをレンダリングできます(一度プラグを抜いてからプラグを差し戻すと、次のようになります):

    +++ -   2016-11-18 14:18:29.577094838 +0100
    +/sys/class/net/eth0/carrier:0
    +/sys/class/net/eth0/carrier_changes:9
    +/sys/class/net/eth0/duplex:unknown
    +/sys/class/net/eth0/operstate:down
    +/sys/class/net/eth0/speed:-1
    +++ -   2016-11-18 14:18:48.771581903 +0100
    +/sys/class/net/eth0/carrier:1
    +/sys/class/net/eth0/carrier_changes:10
    +/sys/class/net/eth0/duplex:full
    +/sys/class/net/eth0/operstate:up
    +/sys/class/net/eth0/speed:100
    

    Enter を押してループを終了)

    注:これには、 patch をインストールする必要があります。

  4. 罰金として、これについてはすでに何かがあるはずです...

    Linuxのインストールによっては、 if-up および if-down スクリプトを追加して、この種のイベントに対応できるようにすることができます。

    Debian ベース( Ubuntu など)では、スクリプトを保存できます

    /etc/network/if-down.d
    /etc/network/if-post-down.d
    /etc/network/if-pre-up.d
    /etc/network/if-up.d
    

    詳細については、 manインターフェイスを参照してください。

tail -f /var/log/syslog | grep -E 'link (up|down)'

または私にとってより高速な取得:

tail -f /var/log/syslog | grep 'link \(up\|down\)'

syslogファイルをリッスンします。

結果(切断した場合および4秒後に再度接続した場合):

Jan 31 13:21:09 user kernel: [19343.897157] r8169 0000:06:00.0 enp6s0: link down
Jan 31 13:21:13 user kernel: [19347.143506] r8169 0000:06:00.0 enp6s0: link up

arch linux。 (他のディストリビューションではわかりません)、operstateを表示できます。接続されている場合は表示され、そうでない場合は表示されません

/sys/class/net/(interface name here)/operstate
#you can also put watch 
watch -d -n -1 /sys/class/net/(interface name here)/operstate

ifconfigを使用できます

# ifconfig eth0 up
# ifconfig eth0

エントリにRUNNINGと表示されている場合、インターフェイスは物理的に接続されています。これは、インターフェースが構成されているかどうかに関係なく表示されます。

これは、 / sys / class / net / eth0 / operstate の情報を取得する別の方法です。

OpenWRT拡張デバイスをリピーター(仮想イーサネットとワイヤレスLAN機能を追加)として使用していたところ、/ sys / class / net / eth0キャリアとopstateの値が信頼できないことがわかりました。 /sys/class/net/eth0.1と/sys/class/net/eth0.2をいじってみました(少なくとも私の知る限り)何かが物理的に差し込まれ、話していることを検出する信頼できる方法はありませんでしたイーサネットポートの。少なくとも最後のリブート/パワーオン状態以降に何かがプラグインされているかどうかを検出するための少し粗雑ですが、一見信頼できる方法を見つけました(私の場合は必要に応じて正確に機能しました)。

ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'

何もプラグインされておらず、>最後の電源投入またはリブートサイクル以降にプラグインされていた場合(プラグインされてから取り外された場合でも)0。

これは少なくとも誰かの助けになることを願っています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top