जवाबों:
इसे किसी फ़ाइल में सहेजें और फिर चलाएं bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
केवल आईपी पता दिखाने वाले नंबर पाने के लिए अधिक सटीक होना:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
अद्यतन : यदि यह आपके लिए काम नहीं करता है, तो दूसरे उत्तर का प्रयास करें
grep "inet"
एक और विकल्प प्रदान करने के लिए, आप 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)
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
काम कर सकता है ... कितना सुंदर
@ मार्कस-लिंडबर्ग की प्रतिक्रिया मेरी पसंदीदा है। यदि आप -o -4
आईपी के झंडे में शामिल होते हैं तो आपको बहुत अधिक आसानी से पार्स करने योग्य (और सुसंगत) आउटपुट प्राप्त होता है:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
के लिए खड़ा है --oneline
, जो वास्तव में इस तरह की स्थितियों में मदद करने के लिए है। -4
IPv4 पता है, जो अन्य सभी प्रतिक्रियाओं क्या मतलब है सीमा में जोड़ा जाता है।
ip
झंडे से प्यार करो । cut
उन्नत awk
विज़ार्ड के बजाय का उपयोग करना :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
बारे में जानने के बाद मैंने "खोजा" तरीका awk
, और मुझे अपनी पाइपलाइनों पर आदेशों की संख्या को कम करना पसंद है। किसी भी मामले में अच्छा सुझाव।
यहाँ कुछ 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:
स्ट्रिंग के हैं, कैप्चर किए जाते हैं और अंत में हम केवल उन कैप्चर किए गए वर्णों को प्रिंट करते हैं।
आपको 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
मेरा सुझाव है कि नेटिफस जैसी एक पायथन लाइब्रेरी का उपयोग करें जो विशेष रूप से इस उद्देश्य के लिए डिज़ाइन की गई हैं।
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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
यह केवल उपयोग के ip addr
लिए ifconfig
और जो एक प्रतिस्थापन हैawk
प्रतिस्थापन (gsub) के साथ है।
सरल कार्यों के लिए बहुत अधिक प्रक्रियाओं का उपयोग करना बंद करें
बस एक और विकल्प जो उपयोगी हो सकता है यदि आपके पास जाग नहीं है (जैसा कि कुछ एम्बेडेड उपकरणों में ऐसा है):
ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
यह एक सामान्य उपयोगकर्ता के साथ भी इस्तेमाल किया जा सकता है।
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
संयोजन के बजाय केवल दो बार उपयोग करना। अगली बार आपको पहले अन्य सभी उत्तरों को बेहतर ढंग से देखना चाहिए और यह सुनिश्चित करना चाहिए कि आप डुप्लिकेट समाधान न पोस्ट करें। इस मामले में, मुझे लगता है कि यह तर्कपूर्ण है कि क्या यह एक डुप्लिकेट है या सिर्फ समान है, इसलिए कृपया इसे सामान्य संकेत के रूप में लें। धन्यवाद। awk
cut
यह सबसे छोटा तरीका है जो मैं पा सकता हूं:
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 सबनेट मास्क भी शामिल है।
इन दिनों में मल्टीपल इंटरफेस के साथ (उदाहरण के लिए यदि आप एक डॉक का उपयोग करते हैं) और 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
विकल्प का उपयोग करें ।
अपनी स्क्रिप्ट में मैं कुछ इस तरह का उपयोग कर रहा हूँ:
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
यह किसी भी प्रक्रिया को स्पॉन नहीं करता है।