Bagaimana mendeteksi keadaan fisik yang terhubung dari kabel / konektor jaringan?

145

Dalam lingkungan Linux, saya perlu mendeteksi keadaan fisik yang terhubung atau terputus dari konektor RJ45 ke soketnya. Lebih disukai menggunakan skrip BASH saja.

Solusi berikut yang telah diusulkan di situs lain TIDAK berfungsi untuk tujuan ini:

  1. Menggunakan 'ifconfig' - karena kabel jaringan mungkin terhubung tetapi jaringan tidak dikonfigurasi dengan benar atau tidak saat ini.
  2. Ping host - karena produk akan berada dalam LAN menggunakan konfigurasi jaringan yang tidak dikenal dan host yang tidak dikenal.

Apakah tidak ada keadaan yang dapat digunakan dalam sistem file / proc (semua yang ada di sana)?

Bagaimana dunia Linux seharusnya memiliki versi sendiri gelembung Windows yang muncul dari baki ikon yang menunjukkan bahwa Anda baru mencabut kabel jaringan?


Kent Fredric dan lothar , kedua jawaban Anda memuaskan kebutuhan saya ... terima kasih banyak! Yang mana yang akan saya gunakan ... Saya masih belum tahu.

Saya kira saya tidak bisa menempatkan Anda berdua sebagai jawaban yang benar? Dan mungkin adil bagi Anda bahwa saya memang memilih satu. Membalik koin, kurasa? Sekali lagi terima kasih!

Jeach
sumber

Jawaban:

228

Anda ingin melihat simpul di

/ sys / class / net /

Saya bereksperimen dengan milik saya:

Kawat terpasang:

eth0/carrier:1
eth0/operstate:unknown

Kawat dihapus:

eth0/carrier:0
eth0/operstate:down

Kawat Dicolokkan Lagi:

eth0/carrier:1
eth0/operstate:up

Trik Samping: memanen semua properti sekaligus dengan cara mudah:

grep "" eth0/* 

Ini membentuk daftar key:valuepasangan yang bagus.

Kent Fredric
sumber
8
Perhatikan bahwa seperti kata Marco di bawah ini antarmuka harus di atas (bahkan jika tidak dikonfigurasi) untuk menanyakan nilai-nilai ini.
Jamie Kitson
11
grep "" eth0 / * sangat elegan dan mudah, terima kasih! :) Dengan -s switch grep tidak akan mengeluh tentang direktori.
Ray
2
Saya lebih suka grep -H . eth0/*:: Garis emty whipe ini dan mencetak nama entri dengan milik masing-masing baris.
F. Hauri
Kesalahan tentang direktori dari grep dapat diabaikan dengan:grep -s "" eth0/*
mrtumnus
Perhatikan bahwa antarmuka harus dinyalakan. Lihat jawaban Marco di bawah ini. Dalam sistem saya, eth0 tidak diatur secara default dan program saya secara acak menghasilkan alamat IP untuknya. Saya mendapatkan kesalahan "Argumen tidak valid" dari capping operator
VocoJax
84

Anda dapat menggunakan 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

Untuk hanya mendapatkan status Tautan Anda dapat menggunakan grep:

$ sudo ethtool eth0 | grep Link
    Link detected: yes
lothar
sumber
tautan ip | grep BROADCAST | cut -d ':' -f 2 | saat membaca saya; lakukan echo $ i; ethtool $ i | grep Link; selesai
Bryan Hunt
3
Perhatikan bahwa seperti kata Marco di bawah ini antarmuka harus di atas (bahkan jika tidak dikonfigurasi) untuk menanyakan nilai-nilai ini.
Jamie Kitson
ini luar biasa! saya punya cara untuk memeriksa apakah ethernet tersedia, jika ethernet diaktifkan, jika ethernet terhubung tetapi tidak ada cara untuk memeriksa apakah kabel yang sebenarnya terhubung. grep Linkmelakukannya. Terima kasih!!
ᴛʜᴇᴘᴀᴛᴇʟ
Tidak bekerja di sini Ubuntu 16.04 pada perangkat keras HP. antarmuka yang tidak dikonfigurasi adalah "tidak ada tautan", bahkan ketika dipaksa untuk upmenyatakan.
0xF2
26

Gunakan 'ip monitor' untuk mendapatkan perubahan status tautan REAL TIME.

Peter Quiring
sumber
3
Dalam kasus saya, ini adalah satu-satunya jawaban yang berfungsi ... / sys / class / net / eth0 / carrier masih menunjukkan 1ketika kabel saya terputus sementara ip monitorbenar-benar menunjukkan sesuatu
Tim Tisdall
Beberapa yang memperluas metode ini dapat berterima kasih, Peter. Sesuatu seperti contoh apa pun yang menjawab pertanyaan awal tentang mengetahui status steker kabel.
Sopalajo de Arrierez
17

cat /sys/class/net/ethX sejauh ini merupakan metode termudah.

Antarmuka harus dinyalakan, jika tidak, Anda akan mendapatkan kesalahan argumen yang tidak valid.

Jadi pertama:

ifconfig ethX up

Kemudian:

cat /sys/class/net/ethX
Marco
sumber
4
Coba "cat / sys / class / net / eth [n] / operstate" di mana [n] adalah nomor perangkat eth.
pmont
Ini hanya memberi tahu Anda jika eth [n] naik, Jika turun tidak memberitahu Anda apakah kabel terhubung atau tidak.
Brice
@Brice, memang, Anda ingin memeriksa file ethX/carrieryang 1 jika 'pembawa' terdeteksi, yang berarti bahwa kabel tersambung dan membawa data ...
Alexis Wilke
Ini bekerja untuk saya menggunakan perintah Process Runtime Exec untuk memeriksa apakah kabel terhubung di Android.
Arlyn
Atau, setelah ifconfig ethX up, ifconfig ethX dan cari RUNNING.
craig65535
8

Pada level rendah, peristiwa ini dapat ditangkap menggunakan soket rtnetlink , tanpa polling apa pun. Catatan: jika Anda menggunakan rtnetlink, Anda harus bekerja sama dengan udev, atau program Anda mungkin bingung ketika udev mengganti nama antarmuka jaringan baru.

Masalah dengan melakukan konfigurasi jaringan dengan skrip shell adalah skrip shell mengerikan untuk penanganan acara (seperti kabel jaringan yang dicolokkan ke dalam dan ke luar). Jika Anda membutuhkan sesuatu yang lebih kuat, lihat bahasa pemrograman NCD saya , bahasa pemrograman yang dirancang untuk konfigurasi jaringan.

Misalnya, skrip NCD sederhana yang akan mencetak "kabel masuk" dan "kabel keluar" ke stdout (dengan asumsi antarmuka sudah ada di atas):

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 :)
}

(secara internal, net.backend.waitlink()menggunakan rtnetlink, dan net.backend.waitdevice()menggunakan udev)

Gagasan NCD adalah Anda menggunakannya secara eksklusif untuk mengonfigurasi jaringan, jadi biasanya, perintah konfigurasi akan muncul di antaranya, seperti:

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");
}

Bagian penting yang perlu diperhatikan adalah eksekusi diizinkan untuk mundur ; dalam contoh kedua, misalnya, jika kabel dicabut, alamat IP secara otomatis akan dihapus.

Ambroz Bizjak
sumber
4

Ada dua daemon yang mendeteksi peristiwa ini:

ifplugd dan netplugd

Jerman
sumber
Saya menggunakan ifplugstatusalat dari ifplugddaemon. Tidak perlu untuk argumen, cukup ketik ifplugstatusdan Anda akan mendapatkan semua NIC sebagai terhubung atau dicabut.
Sopalajo de Arrierez
3

Sebagian besar distribusi Linux modern menggunakan NetworkManager untuk ini. Anda bisa menggunakan D-BUS untuk mendengarkan acara.

Jika Anda ingin alat baris perintah memeriksa status, Anda juga dapat menggunakan mii-tool, mengingat Anda mempertimbangkan Ethernet.

andri
sumber
3
mii-tool telah diawasi oleh ethtool. mii-tool tidak mengetahui tautan GigE.
JimB
Selain itu, sebagian besar server telah mengkonfigurasi adaptor secara manual, yang diabaikan oleh NM.
JimB
1
mii-tooltampaknya menjadi satu-satunya perintah yang dapat melaporkan status tautan saat antarmuka mati.
donasi berhasil
2

Saya menggunakan perintah ini untuk memeriksa kabel yang terhubung:

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

Jika hasilnya akan naik atau turun. Kadang-kadang itu menunjukkan tidak dikenal, maka Anda perlu memeriksa

eth0/carrier

Ini menunjukkan 0 atau 1

Sarvar Nishonboev
sumber
2

Beberapa persiapan dan trik

  1. Saya melakukan semua ini sebagai pengguna normal (bukan root )

  2. Dapatkan info dari dmesg

    Menggunakan dmesgadalah salah satu hal pertama yang harus dilakukan untuk menanyakan kondisi sistem saat ini:

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

    dapat menjawab sesuatu seperti:

    [936536.904154] e1000e: eth0 NIC Link is Down
    

    atau

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

    tergantung pada keadaan, pesan dapat bervariasi tergantung pada perangkat keras dan driver yang digunakan.

    Catatan: ini bisa dengan tertulis dmesg|grep eth.*Link.is|tail -n1tetapi saya lebih suka menggunakan 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. Tes di sekitar /syssistem file semu

    Membaca atau menulis di bawah /sysdapat merusak sistem Anda, terutama jika dijalankan sebagai root ! Anda telah diperingatkan ;-)

    Ini adalah metode penyatuan, bukan pelacakan peristiwa nyata .

    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
    

    Bisa membuat sesuatu seperti (setelah Anda mencabut dan menyambungkan kembali, tergantung):

    +++ -   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
    

    (Tekan Enteruntuk keluar lingkaran)

    Catatan: Ini perlu patchdiinstal.

  4. Baik-baik saja, pasti ada sesuatu tentang ini ...

    Bergantung pada Instalasi Linux , Anda dapat menambahkan if-updan if-downskrip untuk dapat bereaksi terhadap peristiwa semacam ini.

    Di berbasis Debian (seperti Ubuntu ), Anda dapat menyimpan skrip Anda

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

    lihat man interfacesinfo lebih lanjut.

F. Hauri
sumber
Terima kasih atas komentar dan masukan Anda tentang masalah ini. Meskipun, Anda menyadari bahwa ini adalah skrip 'otomatis'. Di poin 2, ketika Anda mengatakan output ' atau ' output lain, atau ketika Anda mengatakan " tergantung pada keadaan, pesan dapat bervariasi tergantung pada perangkat keras dan driver yang digunakan " ... itu masalah besar. Output harus konsisten atau skrip produksi mulai rusak. Tapi itu informasi yang bagus, terima kasih.
Jeach
@Jeach Output dapat berbeda-beda artinya: Anda dapat menggunakan driver lain selaine1000 dan bahkan bisa terjadi pada waktu lain936555.596870 , tetapi Anda akan melihat NIC Link is.
F. Hauri
2

Anda dapat menggunakan ifconfig.

# ifconfig eth0 up
# ifconfig eth0

Jika entri menunjukkan RUNNING, antarmuka terhubung secara fisik. Ini akan ditampilkan terlepas jika antarmuka dikonfigurasi.

Ini hanyalah cara lain untuk mendapatkan informasi /sys/class/net/eth0/operstate.

craig65535
sumber
Kamu menghemat waktuku !!
ADITYA VALLURU
1

di lengkungan linux. (saya tidak yakin pada distro lain) Anda dapat melihat operstate. yang muncul jika terhubung atau turun jika tidak operstate hidup

/sys/class/net/(interface name here)/operstate
#you can also put watch 
watch -d -n -1 /sys/class/net/(interface name here)/operstate
Skrmnghrd
sumber
1
tail -f /var/log/syslog | grep -E 'link (up|down)'

atau bagi saya lebih cepat mendapat:

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

Ini akan mendengarkan file syslog.

Hasil (jika terputus dan setelah 4 detik terhubung lagi):

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
Dima
sumber
1

Entah bagaimana jika Anda ingin memeriksa apakah kabel ethernet dicolokkan di linux setelah memuji: "ifconfig eth0 down". Saya menemukan solusinya: gunakan alat 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

jika kabel tersambung, uji tautan adalah 0, sebaliknya 1.

kyzrong
sumber
0

Saya menggunakan perangkat yang ditingkatkan OpenWRT saya sebagai repeater (yang menambahkan kemampuan ethernet virtual dan nirkabel) dan menemukan bahwa / sys / class / net / eth0 carrier dan nilai opstate tidak dapat diandalkan. Saya bermain-main dengan /sys/class/net/eth0.1 dan /sys/class/net/eth0.2 juga dengan (setidaknya untuk temuan saya) tidak ada cara yang dapat diandalkan untuk mendeteksi bahwa ada sesuatu yang secara fisik terhubung dan berbicara pada setiap port ethernet. Saya menemukan cara yang agak kasar tetapi tampaknya dapat diandalkan untuk mendeteksi jika ada sesuatu yang sudah terpasang sejak negara reboot / poweron terakhir setidaknya (yang bekerja persis seperti yang saya butuhkan dalam kasus saya).

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

Anda akan mendapatkan 0 jika tidak ada yang dicolokkan dan sesuatu> 0 jika ada yang dicolokkan (bahkan jika sudah dicolokkan dan sejak dihapus) sejak daya terakhir hidup atau siklus reboot.

Semoga ini bisa membantu seseorang setidaknya!

JxAxMxIxN
sumber