नेटवर्क केबल / कनेक्टर की भौतिक कनेक्टेड स्थिति का पता कैसे लगाएं?


145

लिनक्स वातावरण में, मुझे आरजे 45 कनेक्टर के भौतिक सॉकेट या डिस्कनेक्टेड स्थिति का पता लगाने की आवश्यकता है। अधिमानतः केवल BASH स्क्रिप्टिंग का उपयोग करना।

निम्नलिखित समाधान जो अन्य साइटों पर प्रस्तावित किए गए हैं वे इस उद्देश्य के लिए काम नहीं करते हैं:

  1. 'Ifconfig' का उपयोग करना - चूंकि एक नेटवर्क केबल जुड़ा हो सकता है लेकिन नेटवर्क ठीक से कॉन्फ़िगर नहीं है या वर्तमान में नहीं है।
  2. पिंग एक मेजबान - चूंकि अज्ञात नेटवर्क कॉन्फ़िगरेशन और अज्ञात होस्ट का उपयोग करके उत्पाद लैन के भीतर होगा।

क्या कोई ऐसा राज्य नहीं है जिसका उपयोग / proc फ़ाइल सिस्टम में किया जा सकता है (बाकी सब कुछ वहां है)?

लिनक्स दुनिया कैसे मानती है कि विंडोज बबल का अपना संस्करण है जो आइकन ट्रे से पॉप अप होता है जो दर्शाता है कि आपने नेटवर्क केबल को अनप्लग कर दिया है?


केंट फ्रेड्रिक और लोथर , आपके दोनों उत्तर मेरी ज़रूरत को पूरा करते हैं ... बहुत बहुत धन्यवाद! मैं किसका उपयोग करूंगा ... मुझे अभी भी नहीं पता है।

मुझे लगता है कि मैं सही उत्तर के रूप में आप दोनों को नीचे नहीं रख सकता हूं? और यह शायद आपके लिए उचित है कि मैं एक का चयन करता हूं। मुझे लगता है कि एक सिक्का पलटें? फिर से धन्यवाद!

जवाबों:


228

आप नोड्स को देखना चाहते हैं

/ Sys / कक्षा / नेट /

मैंने अपने साथ प्रयोग किया:

तार प्लग में:

eth0/carrier:1
eth0/operstate:unknown

तार हटाया गया:

eth0/carrier:0
eth0/operstate:down

तार फिर से प्लग में:

eth0/carrier:1
eth0/operstate:up

साइड ट्रिक: एक बार आसान तरीके से सभी गुणों की कटाई:

grep "" eth0/* 

यह key:valueजोड़े की एक अच्छी सूची बनाता है ।


8
ध्यान दें कि जैसा कि मार्को कहता है कि इन मूल्यों को क्वेरी करने के लिए इंटरफ़ेस के नीचे होना चाहिए (भले ही कॉन्फ़िगर नहीं किया गया हो)।
जेमी किट्सन

11
grep "" eth0 / * बहुत सुंदर और आसान है, धन्यवाद! :) -s स्विच के साथ grep निर्देशिकाओं के बारे में शिकायत नहीं करेगा।
रे

2
मैं पसंद करता हूं grep -H . eth0/*:: यह व्हिप एम्टी लाइनों और प्रिंट प्रविष्टि नाम के साथ प्रत्येक लाइनों से संबंधित है।
एफ। हौरी

grep -s "" eth0/*
Grep

ध्यान दें कि इंटरफ़ेस को ऊपर करना होगा। नीचे मार्को का उत्तर देखें। मेरे सिस्टम में, eth0 डिफ़ॉल्ट रूप से सेट नहीं किया गया है और मेरा प्रोग्राम बेतरतीब ढंग से इसके लिए एक आईपी पता उत्पन्न करता है। मुझे वाहक को पूरा करने से "अमान्य तर्क" त्रुटि मिलती है
VocoJax

84

आप इथूल का उपयोग कर सकते हैं :

$ 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

आईपी ​​लिंक | grep BROADCAST | कट -d ':' -f 2 | जबकि मैं पढ़ा; $ इको करो; ethtool $ i | grep लिंक; किया
ब्रायन हंट

3
ध्यान दें कि जैसा कि मार्को कहता है कि इन मूल्यों को क्वेरी करने के लिए इंटरफ़ेस के नीचे होना चाहिए (भले ही कॉन्फ़िगर नहीं किया गया हो)।
जेमी किट्सन

यह कमाल का है! मेरे पास यह जांचने का एक तरीका है कि क्या ईथरनेट उपलब्ध है, यदि ईथरनेट सक्षम है, यदि ईथरनेट जुड़ा हुआ है, लेकिन वास्तविक केबल जुड़ा था या नहीं, यह जांचने का कोई तरीका नहीं है। grep Linkक्या यह। धन्यवाद!!
ᴛʜᴇᴘᴀᴛᴇʟ

यहां काम नहीं हो रहा है। HP हार्डवेयर पर Ubuntu 16.04। अपुष्ट इंटरफेस upराज्य के लिए मजबूर होने पर भी "कोई लिंक नहीं" हैं ।
0xF2

26

वास्तविक समय की स्थिति में बदलाव लाने के लिए 'आईपी मॉनिटर' का उपयोग करें।


3
मेरे मामले में, यह एकमात्र उत्तर है जो काम किया ... / sys / class / net / eth0 / वाहक अभी भी दिखाता है 1जब मेरी केबल काट दी जाती है जबकि ip monitorवास्तव में कुछ दिखाता है
टिम टिस्डल

इस पद्धति पर विस्तार करने वाले कुछ लोगों को धन्यवाद दिया जा सकता है, पीटर। केबल प्लग स्टेट को जानने के मूल प्रश्न का उत्तर देने वाले किसी भी उदाहरण की तरह।
सूपालाजो डे एरियेरेज़

17

cat /sys/class/net/ethX अब तक की सबसे आसान विधि है।

इंटरफ़ेस को ऊपर रखना होगा, अन्यथा आपको एक अमान्य तर्क त्रुटि मिलेगी।

तो पहले:

ifconfig ethX up

फिर:

cat /sys/class/net/ethX

4
"Cat / sys / class / net / eth [n] / operstate" का प्रयास करें जहाँ [n] एथ डिवाइस नंबर है।
अपराह्न

यह केवल आपको बताता है कि अगर एथ [n] ऊपर है, अगर यह नीचे है तो यह आपको यह नहीं बताता है कि केबल जुड़ा हुआ है या नहीं।
ब्राइस

@Brice, वास्तव में, आप फ़ाइल की जांच करना चाहते हैं ethX/carrierजो 1 है यदि 'वाहक' का पता चला है, जिसका अर्थ है कि एक केबल जुड़ा हुआ है और डेटा ले जा रहा है ...
एलेक्सिस विलके

यह मेरे लिए प्रोसेस रनटाइम एक्ज़ेक कमांड का उपयोग करके जांचने के लिए काम करता है कि क्या केबल एंड्रॉइड में कनेक्ट है।
अरिलॉन

या, ifconfig ethX अप के बाद, ifconfig ethX और RUNNING की तलाश करें।
craig65535

8

निचले स्तर पर , बिना किसी मतदान के इन घटनाओं को rtnetlink सॉकेट्स का उपयोग करके पकड़ा जा सकता है । साइड नोट: यदि आप rtnetlink का उपयोग करते हैं, तो आपको udev के साथ मिलकर काम करना होगा, या जब आपका नेटवर्क एक नए नेटवर्क इंटरफ़ेस का नाम बदल देता है, तो आपका प्रोग्राम भ्रमित हो सकता है।

शेल स्क्रिप्ट के साथ नेटवर्क कॉन्फ़िगरेशन करने में समस्या यह है कि शेल स्क्रिप्ट ईवेंट हैंडलिंग के लिए भयानक हैं (जैसे कि नेटवर्क केबल को प्लग-इन और आउट किया जा रहा है)। यदि आपको कुछ अधिक शक्तिशाली चाहिए, तो मेरी एनसीडी प्रोग्रामिंग भाषा , नेटवर्क कॉन्फ़िगरेशन के लिए डिज़ाइन की गई प्रोग्रामिंग भाषा पर एक नज़र डालें ।

उदाहरण के लिए, एक साधारण एनसीडी स्क्रिप्ट जो "केबल इन" और "केबल आउट" को स्टडआउट (इंटरफ़ेस पहले से ही मान रही है) को प्रिंट करेगी:

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 का उपयोग करता है)

एनसीडी का विचार यह है कि आप इसका उपयोग नेटवर्क को कॉन्फ़िगर करने के लिए विशेष रूप से करते हैं, इसलिए सामान्य रूप से, कॉन्फ़िगरेशन कमांड्स के बीच में आएगा, जैसे:

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

ध्यान देने वाली महत्वपूर्ण बात यह है कि निष्पादन को पुन : प्राप्त करने की अनुमति है ; उदाहरण के लिए, उदाहरण के लिए, यदि केबल को बाहर निकाला जाता है, तो आईपी पता स्वचालित रूप से हटा दिया जाएगा।


4

इन घटनाओं का पता लगाने वाले दो डेमॉन मौजूद हैं:

ifplugd और netplugd


मैं डेमॉन ifplugstatusसे टूल का उपयोग करता हूं ifplugd। तर्क की कोई जरूरत नहीं है, बस टाइप करें ifplugstatusऔर आपको सभी एनआईसी को प्लग या अनप्लग के रूप में मिलेगा।
सोपालाजो डी एरियेरेज़

3

अधिकांश आधुनिक लिनक्स वितरण इसके लिए NetworkManager का उपयोग करते हैं। घटनाओं को सुनने के लिए आप डी-बस का उपयोग कर सकते हैं।

यदि आप स्थिति की जांच करने के लिए एक कमांड-लाइन टूल चाहते हैं, तो आप उपयोग कर सकते हैं mii-tool, यह देखते हुए कि आपके पास ईथरनेट है।


3
mii-tool को एथ्टूल द्वारा सुपरटेक किया गया है। mii- उपकरण गीगई लिंक से अनजान है।
जिमबेल

इसके अलावा, अधिकांश सर्वरों ने मैन्युअल रूप से एडेप्टर कॉन्फ़िगर किए हैं, जिन्हें एनएम द्वारा अनदेखा किया गया है।
जिमबेल

1
mii-toolप्रतीत होता है कि केवल एक ही कमांड है जो इंटरफ़ेस डाउन होने पर लिंक स्थिति पर रिपोर्ट कर सकता है।
donothingsuccessfully

2

मैं इस कमांड का उपयोग एक तार से जुड़े जांचने के लिए करता हूं:

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

यदि परिणाम ऊपर या नीचे होगा। कभी-कभी यह अज्ञात दिखाई देता है, फिर आपको जांचने की आवश्यकता है

eth0/carrier

यह 0 या 1 दिखाता है


2

कुछ पूर्वधारणा और टोटके

  1. मैं यह सब सामान्य उपयोगकर्ता के रूप में करता हूं ( रूट नहीं )

  2. से infos पकड़ो 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आपके सिस्टम को तोड़ सकता है, खासकर अगर रूट के रूप में चलाया जाए ! आपको चेतावनी दी गई थी ;-)

    यह एक पूलिंग विधि है, वास्तविक घटना ट्रैकिंग नहीं है

    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. ठीक है, पहले से ही इस बारे में कुछ होना चाहिए ...

    लिनक्स इंस्टॉलेशन के आधार पर , आप इस तरह की घटनाओं पर प्रतिक्रिया करने में सक्षम होने के लिए स्क्रिप्ट if-upऔर जोड़ सकते हैं if-down

    पर डेबियन आधारित (जैसे 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 आउटपुट मतलब भिन्न हो सकते हैं: आप की तुलना में एक और ड्राइवर का उपयोग कर सकतेe1000 हैं और EVENEMENT से किसी अन्य समय पर हो सकता है936555.596870 , लेकिन आप Allway देखेंगे NIC Link is
एफ। हौरी

2

आप ifconfig का उपयोग कर सकते हैं।

# ifconfig eth0 up
# ifconfig eth0

यदि प्रविष्टि RUNNING दिखाती है, तो इंटरफ़ेस भौतिक रूप से जुड़ा हुआ है। यदि इंटरफ़ेस कॉन्फ़िगर किया गया है, तो यह दिखाया जाएगा।

यह जानकारी प्राप्त करने का एक और तरीका है /sys/class/net/eth0/operstate


तुमने मेरे घंटे बचाए !!
आदित्य वल्लुरू

1

आर्च लाइन पर। (im अन्य डिस्ट्रोस पर यकीन नहीं है) आप ऑपरस्टेट देख सकते हैं। अगर पता चलता है कि जुड़ा हुआ है या नीचे तो नहीं है, अगर ऑपरेट नहीं रहता है

/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

किसी तरह अगर आप जांचना चाहते हैं कि क्या ईथरनेट केबल लिनक्स में कम्यूट के बाद प्लग किया गया था: "ifconfig eth0 down"। मुझे एक समाधान मिलता है: इथूल टूल का उपयोग करें।

#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 एन्हांस्ड डिवाइस को एक पुनरावर्तक (जो वर्चुअल ईथरनेट और वायरलेस लैन क्षमताओं को जोड़ता है) का उपयोग कर रहा था और पाया कि / 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 अगर कुछ भी प्लग किया गया है (भले ही इसे प्लग किया गया हो और हटा दिया गया हो) तब से या रिबूट चक्र पर अंतिम शक्ति।

आशा है कि यह किसी को कम से कम मदद करता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.