web-dev-qa-db-ja.com

ネットワークケーブル/コネクタの物理的な接続状態を検出する方法

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

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

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

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

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


ケント・フレドリック そして ロシャール、あなたの答えは両方とも私のニーズを満たします...どうもありがとう!どれを使うか...まだわかりません。

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

133
Jeach

あなたはノードを見てみたい

/sys/class/net /

私は私のものを試しました:

差し込まれたワイヤー:

eth0/carrier:1
eth0/operstate:unknown

削除されたワイヤー:

eth0/carrier:0
eth0/operstate:down

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

eth0/carrier:1
eth0/operstate:up

Side Trick:簡単な方法ですべてのプロパティを一度に収穫する:

grep "" eth0/* 

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

204
Kent Fredric

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
78
lothar

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

24
Peter Quiring

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

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

最初に:

ifconfig ethX up

次に:

cat /sys/class/net/ethX
17
Marco

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

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

たとえば、「ケーブルイン」と「ケーブルアウト」を標準出力に出力する単純な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");
}

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

8
Ambroz Bizjak

これらのイベントを検出する2つのデーモンがあります。

ifplugdおよびnetplugd

4
germanjaber

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

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

結果がアップまたはダウンする場合。時々それは未知を示します、そして次に確認する必要があります

eth0/carrier

0または1を示します

2

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

  1. 私はこれをすべて通常のユーザーとして(notroot

  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疑似ファイルシステムをテストする

    特にrootとして実行すると、/syscの下で読み取りまたは書き込みを行うと、システムが破損する可能性があります。あなたは警告されました;-)

    これはプーリング方式であり、実際のイベントトラッキングではありません。

    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 interfacesを参照してください。

2
F. Hauri

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

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

2
andri
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
1
Dima

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
0
screaminghard

can ifconfigを使用します。

# ifconfig eth0 up
# ifconfig eth0

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

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

0
craig65535

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が、プラグインされている場合(プラグインされてから取り外された場合でも)> 0が返されます。

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

0
JxAxMxIxN