Bir ağ kablosunun / konektörün fiziksel bağlı durumunu nasıl tespit edebilirim?


146

Bir Linux ortamında, bir RJ45 konektörünün soketine fiziksel bağlı veya bağlı olmayan durumunu tespit etmem gerekir. Tercihen sadece BASH komut dosyası kullanarak.

Diğer sitelerde önerilen aşağıdaki çözümler bu amaçla ÇALIŞMAZ:

  1. 'İfconfig' kullanılıyor - çünkü bir ağ kablosu bağlı olabilir, ancak ağ düzgün yapılandırılmamış veya şu anda çalışmıyor.
  2. Ana bilgisayara ping atın - ürün bilinmeyen bir ağ yapılandırması ve bilinmeyen ana makineler kullanılarak bir LAN içinde olacağından.

/ Proc dosya sisteminde kullanılabilecek bir durum yok mu (diğer her şey orada)?

Linux dünyası, ağ tepsisini çıkardığınızı gösteren simge tepsisinden çıkan kendi Windows balonunun kendi sürümüne nasıl sahip olabilir?


Kent Fredric ve lothar , her iki cevabım da ihtiyacımı karşılıyor ... çok teşekkürler! Hangisini kullanacağım ... Hala bilmiyorum.

Sanırım ikinizi de doğru cevap olarak söyleyemem? Ve bir tane seçmem muhtemelen sizin için adil. Bir bozuk para çevir sanırım? Tekrar teşekkürler!

Yanıtlar:


228

İçindeki düğümlere bakmak istersin

/ Sys / class / net /

Benimle deney yaptım:

Kablo Takılı:

eth0/carrier:1
eth0/operstate:unknown

Tel Kaldırıldı:

eth0/carrier:0
eth0/operstate:down

Tel tekrar takıldı:

eth0/carrier:1
eth0/operstate:up

Side Trick: tüm özellikleri bir kerede kolay bir şekilde hasat edin:

grep "" eth0/* 

Bu güzel bir key:valueçift listesi oluşturur .


8
Marco'nun aşağıda belirttiği gibi, bu değerleri sorgulamak için arayüzün (yapılandırılmamış olsa bile) olması gerektiğini unutmayın.
Jamie Kitson

11
grep "" eth0 / * çok şık ve kolaydır, teşekkürler! :) -s anahtarı ile grep dizinler hakkında şikayet olmaz.
Ray

2
Ben tercih ederim: grep -H . eth0/*Bu whipe emty hatları ve baskı giriş adı ile her satır aittir.
F. Hauri

Grep dizinlerinden hatalar şu şekilde göz ardı edilebilir:grep -s "" eth0/*
mrtumnus

Arayüzün açık olması gerektiğini unutmayın. Aşağıdaki Marco'nun cevabına bakınız. Sistemimde, eth0 varsayılan olarak ayarlanmamıştır ve programım bunun için rastgele bir IP adresi oluşturur. Taşıyıcının oluşturulmasından "Geçersiz argüman" hatası alıyorum
VocoJax

85

Ethtool'u kullanabilirsiniz :

$ 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

Yalnızca Bağlantı durumunu almak için grep'i kullanabilirsiniz:

$ sudo ethtool eth0 | grep Link
    Link detected: yes

ip bağlantısı | grep YAYIN | cut -d ':' -f 2 | okurken; echo $ i yap; ethtool $ i | grep Bağlantı; bitti
Bryan Hunt

3
Marco'nun aşağıda belirttiği gibi, bu değerleri sorgulamak için arayüzün (yapılandırılmamış olsa bile) olması gerektiğini unutmayın.
Jamie Kitson

bu harika! Ethernet'in mevcut olup olmadığını, ethernet etkinse, ethernet bağlıysa, ancak gerçek kablonun bağlı olup olmadığını kontrol etmenin bir yolu yoktu. grep Linkyapar. Teşekkür ederim!!
ᴛʜᴇᴘᴀᴛᴇʟ

Burada çalışmıyor. HP donanımında Ubuntu 16.04. yapılandırılmamış arabirimler, bildirmeye zorlandığında bile "bağlantı yok" dur up.
0xF2

26

GERÇEK ZAMAN bağlantı durumu değişikliklerini almak için 'ip monitör'ü kullanın.


3
Benim durumumda, bu işe yarayan tek cevap bu ... / sys / class / net / eth0 / taşıyıcı hala bir şey gösterirken 1ip monitor
kablomın

Bu yönteme genişleyen bazılarına teşekkür edilebilir, Peter. Kablo fiş durumunu bilmeyle ilgili orijinal soruya cevap veren herhangi bir örnek gibi bir şey.
Sopalajo de Arrierez

17

cat /sys/class/net/ethX açık ara en kolay yöntemdir.

Arayüzün açık olması gerekir, aksi takdirde geçersiz bir argüman hatası alırsınız.

İlk önce:

ifconfig ethX up

Sonra:

cat /sys/class/net/ethX

4
"Cat / sys / class / net / eth [n] / operstate" komutunu deneyin; burada [n] eth aygıt numarasıdır.
pmont

Bu sadece eth [n] 'in yukarıda olup olmadığını söyler, eğer kapalı ise kablonun bağlı olup olmadığını söylemez.
Brice

@Brice, gerçekten, ethX/carrier'taşıyıcı' algılanırsa 1 olan dosyayı kontrol etmek istersiniz , yani bir kablo bağlanır ve veri taşır ...
Alexis Wilke

Bu, kablonun Android'de bağlanıp bağlanmadığını kontrol etmek için Process Runtime Exec komutlarını kullanarak benim için çalıştı.
Arlyn

Veya, ifconfig ethX up işleminden sonra, ifconfig ethX ve RUNNING öğesini arayın.
craig65535

8

Düşük düzeyde, bu olaylar rtnetlink kullanılarak yakalanabilir yoklama olmadan soketleri . Yan not: rtnetlink kullanıyorsanız, udev ile birlikte çalışmanız gerekir, aksi halde udev yeni bir ağ arabirimini yeniden adlandırdığında programınız karışabilir.

Kabuk komut dosyalarıyla ağ yapılandırmaları yapmadaki sorun, kabuk komut dosyalarının olay işleme için korkunç olmasıdır (ağ kablosunun takılması ve çıkarılması gibi). Daha güçlü bir şeye ihtiyacınız varsa, NCD programlama dilime bir göz atın , ağ yapılandırmaları için tasarlanmış bir programlama dili olan .

Örneğin, stdout'a "kablo girişi" ve "kablo çıkışı" yazdıracak basit bir NCD betiği (arabirimin zaten açık olduğu varsayılarak):

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

(dahili olarak net.backend.waitlink()rtnetlink net.backend.waitdevice()kullanır ve udev kullanır)

NCD fikri, sadece ağı yapılandırmak için kullanmanızdır, bu nedenle normalde, aşağıdaki gibi yapılandırma komutları gelir:

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

Dikkat edilmesi gereken önemli nokta, infazın gerilemesine izin verilmesi ; ikinci örnekte, örneğin, kablo çıkarılırsa, IP adresi otomatik olarak kaldırılır.


4

Bu olayları tespit eden iki cin var:

ifplugd ve netplugd


Ben arka plandaki ifplugstatusaracı kullanıyorum ifplugd. ifplugstatusBağımsız değişkenlere gerek yok, sadece yazın ve tüm NIC'yi takılı veya takılı değil olarak alırsınız.
Sopalajo de Arrierez

3

Modern Linux dağıtımlarının çoğu NetworkManager'ı kullanır . Olayları dinlemek için D-BUS kullanabilirsiniz.

Bir komut satırı aracının durumunu kontrol mii-tooletmesini istiyorsanız, Ethernet'i göz önünde bulundurarak da kullanabilirsiniz .


3
mii-tool ettool tarafından üstündür. mii-aracı GigE bağlantılarından habersizdir.
JimB

ayrıca, çoğu sunucu NM tarafından yoksayılan manuel olarak yapılandırılmış adaptörlere sahiptir.
JimB

1
mii-toolarayüz kapalıyken bağlantı durumu hakkında rapor verebilen tek komut gibi görünüyor.
donothingsuccessfully

2

Ben bir tel bağlı kontrol etmek için bu komutu kullanın:

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

Sonuç yukarı veya aşağı olacaksa. Bazen bilinmeyen gösterir, o zaman kontrol etmeniz gerekir

eth0/carrier

0 veya 1 gösterir


2

Bazı kesinlikler ve püf noktaları

  1. Bütün bunları normal kullanıcı olarak yapıyorum ( root değil )

  2. Bilgileri alın dmesg

    Kullanmak dmesg, sistemin mevcut durumunu sorgulamak için yapılacak ilk şeylerden biridir :

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

    gibi bir şeye cevap verebilir:

    [936536.904154] e1000e: eth0 NIC Link is Down
    

    veya

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

    duruma bağlı olarak, mesaj kullanılan donanıma ve sürücülere bağlı olarak değişebilir.

    Nota: Bu yazı ile yapılabilir dmesg|grep eth.*Link.is|tail -n1ama kullanmayı tercih ederim 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. /sysSahte dosya sistemi etrafında test etme

    Altında okuma veya yazma /syssisteminizi bozabilir, özellikle de kök olarak çalıştırılırsa ! Uyarılmıştın ;-)

    Bu bir havuzlama yöntemidir, gerçek bir olay izleme değildir .

    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
    

    Şunun gibi bir şey oluşturabilir (bağlı olduktan ve fişini taktıktan sonra):

    +++ -   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Çıkış döngüsüne basın)

    Not: Bunun patchkurulması gerekir.

  4. Tamam, bu konuda zaten bir şeyler olmalı ...

    Bağlı Linux kurulumu , eklemek olabilir if-upveif-down bu tür olaylara tepki verebilmek için komut dosyaları komut dosyaları .

    On Debian (gibi esaslı Ubuntu ), içine komut dosyalarınızı depolayabilir

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

    man interfacesdaha fazla bilgi için bkz .


Yorumlarınız ve konuyla ilgili bilgiler için teşekkürler. Bununla birlikte, bunların 'otomatik' komut dosyaları olduğunu fark ediyorsunuz. 2. noktada, çıktı ' ya da ' başka bir çıktı ' ya da "duruma bağlı olarak, mesaj kullanılan donanıma ve sürücülere bağlı olarak değişebilir " derseniz ... bu çok büyük bir sorun. Çıktı tutarlı olmalı veya üretim komut dosyaları bozulmaya başlamalıdır. Ama ne olursa olsun iyi bir bilgi, teşekkürler.
Jeach

@Jeach Çıktısı değişiklik gösterebilir: Şundan başka bir sürücü kullanabilirsinize1000 ve akşam daha farklı bir zamanda gerçekleşebilir936555.596870 , ancak yine de görürsünüz NIC Link is.
F.Hauri

2

Sen edebilirsiniz ifconfig kullanın.

# ifconfig eth0 up
# ifconfig eth0

Girişte ÇALIŞIYOR mesajı görüntüleniyorsa, arayüz fiziksel olarak bağlanmıştır. Bu, arayüz yapılandırılmış olup olmadığına bakılmaksızın gösterilir.

Bu, bilgiyi almanın başka bir yoludur /sys/class/net/eth0/operstate.


Saatlerimi kurtardın !!
ADITYA VALLURU

1

kemer linux üzerinde. (im diğer dağıtımlarda emin değilim) operstate görebilirsiniz. bağlıysa ya da operstate açık değilse çalışmıyor

/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)'

ya da benim için daha hızlı:

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

Syslog dosyasını dinleyecektir.

Sonuç (bağlantı kesilirse ve 4 saniye sonra tekrar bağlanırsa):

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

Her nasılsa ethernet kablosunun linux'a takıldığından sonra linux'a takılı olup olmadığını kontrol etmek istiyorsanız: "ifconfig eth0 down". Bir çözüm buldum: Ethtool aracını kullanın.

#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

kablo bağlıysa, bağlantı testi 0'dır, aksi takdirde 1'dir.


0

OpenWRT gelişmiş cihazımı tekrarlayıcı olarak kullanıyordum (sanal ethernet ve kablosuz lan yetenekleri ekliyor) ve / sys / class / net / eth0 taşıyıcı ve opstate değerlerinin güvenilir olmadığını gördüm. /Sys/class/net/eth0.1 ve /sys/class/net/eth0.2 ile de oynadım (en azından benim bulmam için), bir şeyin fiziksel olarak takıldığını ve herhangi biriyle konuştuğunu tespit etmenin güvenilir bir yolu yok Ethernet bağlantı noktalarının. En azından son yeniden başlatma / poweron durumundan bu yana bir şey takılıp takılmadığını tespit etmek için biraz kaba ama görünüşte güvenilir bir yol buldum (tam da benim durumumda gerektiği gibi çalıştı).

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

Hiçbir şey takılmadıysa 0, son açma veya yeniden başlatma döngüsünden bu yana bir şey takılmışsa (takılı ve çıkarılmış olsa bile)> 0 alırsınız.

Umarım bu en azından birine yardım eder!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.