Eth0 इंटरफ़ेस पर आईपी पता प्रदर्शित करना


24

मैं एक स्क्रिप्ट का उपयोग करके eth0 पर दिखाए गए आईपी पते को कैसे प्रदर्शित कर सकता हूं?

जवाबों:


28

इसे किसी फ़ाइल में सहेजें और फिर चलाएं bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

केवल आईपी पता दिखाने वाले नंबर पाने के लिए अधिक सटीक होना:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

अद्यतन : यदि यह आपके लिए काम नहीं करता है, तो दूसरे उत्तर का प्रयास करें


2
बेशक यह नवीनतम ubuntu में काम नहीं करता है। नवीनतम inconfig रिटर्न "inet <ip>" के बजाय "inet addr <ip>"
thang

आप बस उपयोग कर सकते हैंgrep "inet"
आंद्रेई रादुलेस्कु

26

एक और विकल्प प्रदान करने के लिए, आप ip addrआईपी ​​एड्रेस प्राप्त करने के लिए इस तरह से कमांड का उपयोग कर सकते हैं :

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 के बारे में जानकारी दिखाता है eth0
  • grep "inet\b"केवल उस पंक्ति को दिखाता है जिसमें IPv4 पता है (यदि आप IPv6 पता चाहते थे, तो इसे बदल दें "inet6\b")
  • awk '{print $2}' दूसरे क्षेत्र पर प्रिंट करता है, जिसमें ipaddress / मास्क है, उदाहरण 172.20.20.15/25
  • cut -d/ -f1 केवल IP पता भाग लेता है।

एक स्क्रिप्ट में:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

यह समाधान वास्तव में काम करता है!
थांग

आईपी ​​-4 ... और आईपी -6 ...! धन्यवाद!
TamusJRoyce

17

Https://stackoverflow.com/a/14910952/1695680 से लिया गया

hostname -i

हालाँकि यह एक स्थानीय आईपी पता (127.0.0.1) लौटा सकता है, इसलिए आपको इसका उपयोग करना होगा, और फ़िल्टर करना होगा:

hostname -I

होस्टनाम के मैनपेज से:

-i, --ip-address

होस्ट नाम का नेटवर्क पता (तों) प्रदर्शित करें। ध्यान दें कि यह केवल तभी काम करता है जब होस्ट नाम हल किया जा सकता है। इस विकल्प का उपयोग करने से बचें; इसके बजाय hostname --all-ip-address का उपयोग करें।

-I, --all-ip-addresses

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


रिकॉर्ड के लिए, मुझे ip addr show label 'enp*'बेहतर पसंद है, लेकिन मैं पार्स को परेशान कर रहा हूं, कुछ ऐसा ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2काम कर सकता है ... कितना सुंदर
ThorSummoner

5

@ मार्कस-लिंडबर्ग की प्रतिक्रिया मेरी पसंदीदा है। यदि आप -o -4आईपी ​​के झंडे में शामिल होते हैं तो आपको बहुत अधिक आसानी से पार्स करने योग्य (और सुसंगत) आउटपुट प्राप्त होता है:

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-oके लिए खड़ा है --oneline, जो वास्तव में इस तरह की स्थितियों में मदद करने के लिए है। -4IPv4 पता है, जो अन्य सभी प्रतिक्रियाओं क्या मतलब है सीमा में जोड़ा जाता है।


ipझंडे से प्यार करो । cutउन्नत awkविज़ार्ड के बजाय का उपयोग करना :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@DuffJ यह शायद व्यक्तिगत स्वाद की बात है। मेरे cutबारे में जानने के बाद मैंने "खोजा" तरीका awk, और मुझे अपनी पाइपलाइनों पर आदेशों की संख्या को कम करना पसंद है। किसी भी मामले में अच्छा सुझाव।
आमोस शापिरा

मैं पूरी तरह से सहमत हूँ, आमोस। आपके समाधान के लिए धन्यवाद!
डफजे

3

यहाँ कुछ oneliners हैं .....

awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

उपरोक्त awk कमांड में स्प्लिट फंक्शन सीमांकक के आधार पर दूसरे कॉलम को विभाजित करता है :और स्प्लिटेड वैल्यू को एक सहयोगी सरणी में संग्रहीत करता है a। तो a[2]दूसरे भाग का मान रखता है।

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

बेसिक सेड में, \(...\)कैप्चरिंग ग्रुप कहलाता है जिसका उपयोग पात्रों को पकड़ने के लिए किया जाता है। हम बैक-रेफ़रिंग के माध्यम से उन कैप्चर किए गए वर्णों का उल्लेख कर सकते हैं। \([^[:space:]]\+\)किसी भी वर्ण को पकड़ता है लेकिन एक या अधिक बार स्थान नहीं।

ग्रेप

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\Kपहले से मिलान किए गए वर्णों को अंतिम रूप से मुद्रित करने से रोकता है और \S+एक या अधिक गैर-स्थान वर्णों से मेल खाता है।

पर्ल

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

एक या एक से अधिक गैर-अंतरिक्ष वर्ण जो आगे हैं inet addr: स्ट्रिंग के हैं, कैप्चर किए जाते हैं और अंत में हम केवल उन कैप्चर किए गए वर्णों को प्रिंट करते हैं।


@edwardtorvalds ने कुछ स्पष्टीकरण जोड़ा। मुझे लगता है कि यह भविष्य के पाठकों के लिए उपयोगी होगा। उपरोक्त आदेशों से कोई भी प्रश्न पूछने के लिए स्वतंत्र महसूस करें ... :)
अविनाश राज

2

यहाँ एक अच्छी बात है, केवल grep को माध्यमिक कमांड के रूप में उपयोग करता है:

आईपी ​​Addr शो eth0 | grep -oP 'inet \ K \ S [0-9।] +'

मैं नहीं देखता कि आपको आवश्यकता से अधिक कमांड का उपयोग क्यों करना चाहिए


2

आपको ipइसके बजाय (इसके बजाय ifconfig) का उपयोग करना चाहिए , क्योंकि यह वर्तमान, बनाए रखा गया है, और संभवतः स्क्रिप्टिंग उद्देश्यों के लिए सबसे महत्वपूर्ण है, यह एक सुसंगत और पार्स करने योग्य आउटपुट का उत्पादन करता है। निम्नलिखित कुछ समान दृष्टिकोण हैं:

यदि आप अपने ईथरनेट इंटरफ़ेस के लिए IPv4 पता चाहते हैं eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

एक स्क्रिप्ट के रूप में:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

उपरोक्त उत्पादन CIDR संकेतन में है। यदि CIDR संकेतन नहीं चाहता है, तो इसे छीन लिया जा सकता है:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

एक अन्य विकल्प जो आईएमएचओ "सबसे सुरुचिपूर्ण" है, जो कुछ भी निर्दिष्ट रिमोट होस्ट (इस मामले में 8.8.8.8) से कनेक्ट करने के लिए उपयोग किया जाता है, के लिए आईपीवी 4 पता मिलता है। इस उत्तर में @gatoatigrado के सौजन्य से :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

एक स्क्रिप्ट के रूप में:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

यह एकल इंटरफ़ेस के साथ मेजबान पर पूरी तरह से काम करता है, लेकिन अधिक लाभप्रद रूप से कई इंटरफेस और / या मार्ग विनिर्देशों के साथ मेजबानों पर भी काम करेगा।

जबकि ipयह मेरा पसंदीदा तरीका होगा, यह निश्चित रूप से इस बिल्ली की त्वचा का एकमात्र तरीका नहीं है। hostnameयदि आप कुछ आसान / अधिक संक्षिप्त पसंद करते हैं, तो यहां एक और दृष्टिकोण है :

$ hostname --all-ip-addresses | awk '{print $1}'  

या, यदि आप IPv6 पता चाहते हैं:

$ hostname --all-ip-addresses | awk '{print $2}'  

एक स्क्रिप्ट के रूप में:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379

1

मेरा सुझाव है कि नेटिफस जैसी एक पायथन लाइब्रेरी का उपयोग करें जो विशेष रूप से इस उद्देश्य के लिए डिज़ाइन की गई हैं।

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

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

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]

1
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

यह केवल उपयोग के ip addrलिए ifconfigऔर जो एक प्रतिस्थापन हैawk प्रतिस्थापन (gsub) के साथ है।

सरल कार्यों के लिए बहुत अधिक प्रक्रियाओं का उपयोग करना बंद करें


1

बस एक और विकल्प जो उपयोगी हो सकता है यदि आपके पास जाग नहीं है (जैसा कि कुछ एम्बेडेड उपकरणों में ऐसा है):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

यहाँ IPv4 के लिए है :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

यहाँ IPv4 और विशेष देव (eth0) के लिए है:

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

के लिए आईपीवी 6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

यह एक सामान्य उपयोगकर्ता के साथ भी इस्तेमाल किया जा सकता है।

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

वह eth0 के लिए पूछता है, आपकी स्क्रिप्ट का यह संस्करण मदद कर सकता है (लूपबैक थो भी दिखा सकता है)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

यह बहुत ही एक ही उत्तर के रूप में पूछ रहा है जैसे कि askubuntu.com/a/560466/367990 , आउटपुट को पार्स करने के लिए और cutसंयोजन के बजाय केवल दो बार उपयोग करना। अगली बार आपको पहले अन्य सभी उत्तरों को बेहतर ढंग से देखना चाहिए और यह सुनिश्चित करना चाहिए कि आप डुप्लिकेट समाधान न पोस्ट करें। इस मामले में, मुझे लगता है कि यह तर्कपूर्ण है कि क्या यह एक डुप्लिकेट है या सिर्फ समान है, इसलिए कृपया इसे सामान्य संकेत के रूप में लें। धन्यवाद। awkcut
बाइट कमांडर

0

यह सबसे छोटा तरीका है जो मैं पा सकता हूं:

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

बदलने के $1अपने नेटवर्क इंटरफ़ेस से ।

ip -f inet आईपी ​​को केवल इनट (ipv4) परिवार के लिए मान वापस करने के लिए कहता है।

grep -Po grep को एक पर्ल-रेगेक्स के रूप में अगले मूल्य को इंटरप्रेट करने के लिए कहता है, और केवल मिलान मूल्यों को प्रिंट करता है।

रेगेक्स \K[\d.]+कहते हैं, "इस बिंदु (\ K) तक सब कुछ फेंक दें, और संभव के रूप में एक पंक्ति में एक डॉट के बाद कई संख्यात्मक मानों के साथ मेल खाएं"। इसलिए यह केवल IP पते से मेल खाता है और इसके बाद की सभी चीज़ों को अनदेखा करता है, जिसमें shortform \ XX सबनेट मास्क भी शामिल है।


0

इन दिनों में मल्टीपल इंटरफेस के साथ (उदाहरण के लिए यदि आप एक डॉक का उपयोग करते हैं) और ETH द्वारा नामकरण इंटरफ़ेस अब मानदंड नहीं है

मैं IP / Mask निकालने के लिए इस कमांड का उपयोग करता हूं:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

इसलिए मेरे पास जो भी इंटरफेस होंगे और जो भी उनके नाम होंगे, GREP केवल पहले वाले MULTICAST विकल्प को ही पकड़ेंगे।

मैं बिना मास्क के केवल IP निकालने के लिए इस कमांड का उपयोग करता हूं:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

मैं इन आदेशों का उपयोग विभिन्न BDS और NIX पर करता हूं, यह कभी भी विफल नहीं होता है;)


यदि आप आउटपुट को पार्स करने जा रहे हैं ip, तो -oविकल्प का उपयोग करें ।
मुरु

0

अपनी स्क्रिप्ट में मैं कुछ इस तरह का उपयोग कर रहा हूँ:

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

यह किसी भी प्रक्रिया को स्पॉन नहीं करता है।


0

फिर भी एक और तरीका (यह मानते हुए कि आपको एक CIDRपता और नहीं चाहिए IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • ipकमांड का उपयोग करता है जो नहीं हैdeprecated
  • छानने के लिए केवल एक कमांड का उपयोग करता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.