ネットワークケーブル/コネクタの物理的な接続状態を検出するにはどうすればよいですか?


145

Linux環境では、ソケットへのRJ45コネクタの物理的な接続または切断状態を検出する必要があります。BASHスクリプトのみを使用することをお勧めします。

他のサイトで提案されている次のソリューションは、この目的には使用できません。

  1. 「ifconfig」の使用-ネットワークケーブルは接続されている可能性がありますが、ネットワークが適切に構成されていないか、現在起動していません。
  2. ホストへのping-製品は不明なネットワーク構成と不明なホストを使用するLAN内にあるため。

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

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


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

両方とも正解にできないと思いますか?そして、おそらくあなたのために私が1つを選択することは公正です。コインを投げます。もう一度、ありがとう!

回答:


228

のノードを確認したい

/ sys / class / net /

私は私の実験をしました:

接続されたワイヤー:

eth0/carrier:1
eth0/operstate:unknown

削除されたワイヤー:

eth0/carrier:0
eth0/operstate:down

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

eth0/carrier:1
eth0/operstate:up

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

grep "" eth0/* 

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


8
Marcoが以下で言うように、これらの値を照会するには、インターフェースが(構成されていなくても)稼働している必要があります。
ジェイミーキットソン2012

11
grep "" eth0 / *はとてもエレガントで簡単です。ありがとうございます!:) -sスイッチを使用すると、grepはディレクトリについて文句を言いません。
Ray

2
私が好む::grep -H . eth0/*このwhipe emty行と印刷エントリ名は各行に属しています。
F.ハウリ2016年

グレップからディレクトリに関するエラーがで無視することができます:grep -s "" eth0/*
mrtumnus

インターフェースが稼働している必要があることに注意してください。以下のマルコの回答を参照してください。私のシステムでは、デフォルトでeth0が設定されておらず、プログラムがランダムにIPアドレスを生成します。キャリアをキャッチすると「無効な引数」エラーが表示される
VocoJax

84

あなたは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リンク| grep BROADCAST | cut -d ':' -f 2 | 私を読んでいる間; $ iをエコーし​​ます。ethtool $ i | grepリンク; 完了
ブライアンハント

3
Marcoが以下で言うように、これらの値を照会するには、インターフェースが(構成されていなくても)稼働している必要があります。
ジェイミーキットソン2012

これはすごい!イーサネットが使用可能かどうか、イーサネットが有効かどうか、イーサネットが接続されているかどうかを確認する方法はありましたが、実際のケーブルが接続されているかどうかを確認する方法はありませんでした。grep Linkそれを行います。ありがとうございました!!
ᴛʜᴇᴘᴀᴛᴇʟ

ここでは働いていません。HPハードウェア上のUbuntu 16.04。未設定のインターフェイスは、強制的にup状態にされた場合でも、「リンクなし」です。
0xF2 2017年

26

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


3
私の場合、これが機能した唯一の答えです... / sys / class / net / eth0 / carrier 1は、ip monitor実際に何かが表示されているときにケーブルが切断されたときにも表示されます
Tim Tisdall

ピーター、この方法の拡張に感謝するかもしれません。ケーブルプラグの状態を知ることに関する元の質問に答える例のようなもの。
Sopalajo de Arrierez

17

cat /sys/class/net/ethX はるかに簡単な方法です。

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

最初に:

ifconfig ethX up

次に:

cat /sys/class/net/ethX

4
「cat / sys / class / net / eth [n] / operstate」を試してください。[n]はethデバイス番号です。
pmont 2013年

これはeth [n]が起動しているかどうかを通知するだけで、停止している場合はケーブルが接続されているかどうかを通知しません。
Brice、2015

@Brice、確かに、ethX/carrier「キャリア」が検出された場合に1であるファイルを確認する必要があります。つまり、ケーブルが接続され、データを伝送しています...
Alexis Wilke

これは、Process Runtime Execコマンドを使用して、ケーブルがAndroidで接続されているかどうかを確認するのに役立ちました。
2016年

または、ifconfig ethXの起動後、ifconfig ethXを実行してRUNNINGを探します。
craig65535

8

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

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

たとえば、「ケーブル入力」および「ケーブル出力」を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アドレスが自動的に削除されます。


4

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

ifplugdおよびnetplugd


デーモンifplugstatusからツールを使用していifplugdます。引数は必要ありません。入力するだけで、ifplugstatusすべてのNICが接続または非接続として取得されます。
Sopalajo de Arrierez

3

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

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


3
mii-toolはethtoolに置き換えられました。mii-toolはGigEリンクを認識しません。
JimB 2009

さらに、ほとんどのサーバーには手動で構成されたアダプターがあり、NMでは無視されます。
JimB 2009

1
mii-toolインターフェイスがダウンしているときにリンクステータスをレポートできる唯一のコマンドのようです。
donothingsは、

2

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

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

結果が上下する場合。時々それは未知を示します、そしてあなたはチェックする必要があります

eth0/carrier

0または1を示します


2

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

  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-upif-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で、「出力」または「別の出力」と言うとき、または「状態によっては、使用するハードウェアとドライバーによってメッセージが異なる場合があります」...これは本当に大きな問題です。出力は一貫している必要があります。そうしないと、生産スクリプトが壊れ始めます。しかし、それは関係なく良い情報です、ありがとう。
Jeach

@Jeach出力は、平均値が異なる場合があります。とは別のドライバーを使用e1000でき936555.596870は別のときに発生する可能性がありますが、すべてが表示されますNIC Link is
F.ハウリ

2

あなたはできる ifconfigコマンドを使用します。

# ifconfig eth0 up
# ifconfig eth0

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

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


あなたは私の時間を節約しました!!
ADITYA VALLURU

1

アーチ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

1
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

どういうわけか、コマンドライン後にイーサネットケーブルがLinuxに接続されているかどうかを確認したい場合: "ifconfig eth0 down"。解決策を見つけました。ethtoolツールを使用します。

#ethtool -t eth0
The test result is PASS
The test extra info:
Register test  (offline)         0
Eeprom test    (offline)         0
Interrupt test (offline)         0
Loopback test  (offline)         0
Link test   (on/offline)         0

ケーブルが接続されている場合、リンクテストは0、それ以外の場合は1です。


0

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を取得します。

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

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