अपना स्वयं का आईपी पता कैसे प्राप्त करें और इसे शेल स्क्रिप्ट में एक चर पर सहेजें?


65

मैं अपना खुद का आईपी पता कैसे प्राप्त कर सकता हूं और इसे शेल स्क्रिप्ट में एक चर में सहेज सकता हूं?


2
सावधानी का एक शब्द: यहां "मेरे सिस्टम पर काम करता है" बहुत सारे उत्तर हैं जो अन्य वातावरणों के लिए पोर्टेबल नहीं हो सकते हैं। आपको यह तय करना होगा कि क्या आप ऐसा कुछ चाहते हैं जो आपके लिए काम करे या जो कुछ साझा किया जा सके। हर सिस्टम में कई आईपी होते हैं। एक पोर्टेबल समाधान Q का जवाब देता है: "क्या आईपी का उपयोग मैं ब्लाह तक पहुंचने के लिए करता हूं ?" मेरे सिस्टम समाधान पर एक काम Q का जवाब देता है: "मेरा आईपी क्या है?" A: "मुझे लगता है कि आप इसका मतलब यह समझते हैं ..." यह पोर्टेबल unix.stackexchange.com/a/402160/9745
Bruno Bronosky

: यह एक तरह से आईपी पते प्रपत्र / proc प्राप्त करने के लिए प्रदान करता है unix.stackexchange.com/questions/365225/...
Pierz

जवाबों:


30

यह इतना आसान नहीं है यदि आप वीलन और अन्य वैकल्पिक इंटरफेस को ध्यान में रखना चाहते हैं। यदि आप जानते हैं कि आप किस इंटरफ़ेस के लिए पता चाहते हैं (उदाहरण के लिए, eth0, पहला ईथरनेट कार्ड), तो आप इसका उपयोग कर सकते हैं:

ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"

दूसरे शब्दों में, मुझे नेटवर्क कॉन्फ़िगरेशन जानकारी प्राप्त करें, इसके लिए देखें, eth0उस रेखा और अगले एक ( -A 1) को प्राप्त करें, केवल अंतिम पंक्ति प्राप्त करें, उस रेखा का दूसरा भाग प्राप्त करें जब विभाजन करते हैं :, तो विभाजित करते समय उस का पहला भाग प्राप्त करें अंतरिक्ष के साथ।


1
मैंने इसमें grep"eth0:" के साथ किसी भी इंटरफ़ेस को अनदेखा करने के लिए आपके कोड में एक अतिरिक्त जोड़ा ; अब यह काम करता है जैसा कि मैं उम्मीद करता हूं (केवल "eth0" आईपी पते और किसी भी उप-इंटरफेस नहीं देना (eth0: 0, eth0: 1, आदि):ip="$(ifconfig | grep -v 'eth0:' | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"

6
आप पहली ग्रीप का उपयोग करके छोड़ सकते हैंifconfig eth0
ब्रायन लार्सन

5
ifconfig को पदावनत किया जाता है, तो आपको ip addressइसके बजाय उपयोग करना चाहिए
एलेक्सिस

70

मेरा मानना ​​है कि "आधुनिक उपकरण" आपके आईपीवी 4 पते को प्राप्त करने का तरीका 'इफकोनिग' के बजाय 'आईपी' को पार्स करना है, इसलिए यह कुछ इस तरह होगा:

ip4=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
ip6=$(/sbin/ip -o -6 addr list eth0 | awk '{print $4}' | cut -d/ -f1)

या कुछ इस तरह का।


4
ipमेरे द्वारा उपयोग किए गए सभी Red Hat और Fedora डिस्ट्रोस पर उपलब्ध है। ipiproute2 पैकेज ( linuxfoundation.org/collaborate/workgroups/networking/iproute2 ) का हिस्सा है । ifconfigऔर routeमाना जाता है कि वे बहुत से लोगों द्वारा उपयोग किए जा रहे हैं, विशेषकर लिपियों में। ipमेरी राय में बहुत अधिक प्रशंसनीय है।
jsbillings

3
ipमैंने देखा सभी डेबियन और डेबियन आधारित डिस्ट्रोस पर भी उपलब्ध है। यह iproute पैकेज का हिस्सा है जिसे महत्वपूर्ण के रूप में चिह्नित किया गया है।
एरोमास्टर

2
यह बिल्कुल ऐसा है कि यह कैसे किया जाना चाहिए, मैं ifconfig के उनके उपयोग के लिए अन्य उत्तरों को नीचा दिखाऊंगा। ipiproute2 पैकेज का एक हिस्सा है जो डिफ़ॉल्ट रूप से कई डिस्ट्रो है। यह सबसे अच्छा भंडार है। en.wikipedia.org/wiki/Iproute2
jwbensley

3
@jsbillings के /sbin/ipबजाय क्यों ip?
l0b0

1
यह एक उत्कृष्ट उत्तर है! के संयोजन awkऔर cutहल्का मेरे लिए मनोरंजक है, यहाँ एक संभावित विकल्प जो वास्तव में बेहतर नहीं हो सकता है है:ip -o -4 addr show eth0 | awk '{ split($4, ip_addr, "/"); print ip_addr[1] }'
स्विस

32

बस क्यों नहीं करते IP=$(hostname -I)?


3
hostname -iमुझे बस देता है 127.0.0.1, hostname -Iमुझे सही आईपी-एड्रेस देता है ...
छात्र

@student हाँ वास्तव में, मैंने इसे एक मशीन पर परीक्षण किया है जो इसके होस्टनाम को हल कर सकती है, जैसा कि मैनपेज कहता है-i Display the network address(es) of the host name. Note that this works only if the host name can be resolved. Avoid using this option; use hostname --all-ip-addresses
आंद्रेई

मैं अपने होस्टनाम को हल करने के लिए अपनी मशीन को कैसे कॉन्फ़िगर कर सकता हूं?
छात्र

सबसे आसान तरीका यह है /etc/hostsकि इसी आईपी पते के साथ इसे जोड़ा जा रहा है
आंद्रेई

3
-IFreeBSD पर नहीं , लेकिन आप उपयोग कर सकते हैंdig +short `hostname -f`
Tigger

24

यदि आप एक इंटरफ़ेस का पता चाहते हैं, तो सबसे आसान तरीका है कि अधिक मोबाइल इंस्टॉल करें:

anthony@Zia:~$ ifdata -pa br0
172.16.1.244

ifdataआपके ifconfigलिए आउटपुट पार्स करने के लिए लुभाए जाने वाले प्रत्येक प्रश्न का बहुत अधिक उत्तर देता है।

यदि आप अपने आईपी पते का पता लगाना चाहते हैं तो बाहर वाला इसे देखता है (किसी भी NAT, आदि से परे), वहाँ बहुत सारी सेवाएं हैं जो इसे करेंगे। एक काफी आसान है:

anthony@Zia:~$ curl ifconfig.me
173.167.51.137

हे भगवान, इस जवाब के लिए धन्यवाद। इससे पहले और कभी नहीं सुना है। मैं गंभीरता से अपने छोटे सी कार्यक्रम लिखने पर विचार कर रहा था कि वास्तव में ऐसा ही है।
क्रिस हैरिंगटन

इसमें ifdataजोड़ा जाना अच्छा होगा iproute2। शायद एक नया बाइनरी कहा जाता हैipdata
स्विस

ifdata अच्छा है लेकिन यह ipv6 का समर्थन नहीं करता है।
ब्रैकबेकोडोर64

15

IPv4 और IPv6 पते प्राप्त करने के लिए, और मान लें कि मुख्य इंटरफ़ेस नहीं है eth0(ये दिन em1 अधिक सामान्य है ), कोशिश करें:

ips=$(ip -o addr show up primary scope global |
      while read -r num dev fam addr rest; do echo ${addr%/*}; done)
  • -oएक पंक्ति का उत्पादन प्रारूप है, जो आसान है के साथ कार्रवाई करने के लिए उपयोग करता है read, grepआदि
  • up उन उपकरणों को बाहर करता है जो सक्रिय नहीं हैं
  • scope globalनिजी और स्थानीय पते जैसे 127.0.0.1औरfe80::/64
  • primaryअस्थायी पते को छोड़कर (यह मानते हुए कि आप ऐसा पता चाहते हैं जो परिवर्तित न हो)

1
इसका सबसे अच्छा जवाब होना चाहिए क्योंकि 1) यह एक डिवाइस नाम नहीं मानता है, 2) यह पुराने स्कूल 'ifconfig' के विपरीत 'आईपी' का उपयोग करता है, और 3) यह आईपीवी 6 का भी समर्थन करता है।
ब्रैकबैकमोडोर64

मैं सहमत हूं, यह ज्यादातर उपयोग के मामलों के लिए सबसे अच्छी शुरुआत है। आप पता प्रकारों को फ़िल्टर करने के लिए -4/ पास कर सकते हैं -6। आप आसानी से अन्य इंटरफ़ेस पैरामीटर भी प्राप्त कर सकते हैं। व्यक्तिगत रूप से, मैं लूप को नापसंद करता हूं और मैं पसंद करता हूंgrep -o 'inet6\? [0-9a-f\.:]*' | cut -f 2 -d ' '
Jérôme Pouiller

7

निर्भर करता है कि आप अपने आईपी पते से क्या मतलब है। सिस्टम में कई सबनेट (कभी-कभी प्रति सबनेट) पर IP पते होते हैं, जिनमें से कुछ IPv4, कुछ IPv6 ईथरनेट एडेप्टर, लूपबैक इंटरफेस, वीपीएन टनल, ब्रिज, वर्चुअल इंटरफेस जैसे उपकरणों का उपयोग करते हैं ...

मेरा मतलब है कि IP पता जिसके द्वारा किसी अन्य दिया गया डिवाइस आपके कंप्यूटर तक पहुंच सकता है, आपको यह पता लगाना होगा कि कौन सा सबनेट है, और हम किस आईपी संस्करण की बात कर रहे हैं। इसके अलावा, ध्यान रखें कि NAT द्वारा फ़ायरवॉल / राउटर द्वारा प्रदर्शन किए जाने के कारण, इंटरफ़ेस का IP पता समान नहीं हो सकता है क्योंकि दूरस्थ होस्ट आपके कंप्यूटर से आने वाले कनेक्शन को देखता है।

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

IPv4 के लिए (संभवतः IPv6 के लिए भी काम करता है), एक चाल जो लिनक्स सहित कई यूनियनों में काम करती है, जो दिए गए होस्ट तक पहुंचने के लिए उपयोग किए गए इंटरफ़ेस के आईपी पते का पता लगाने के लिए एक यूडीपी सॉकेट पर कनेक्ट (2) का उपयोग करना और उपयोग करना है ():

उदाहरण के लिए, मेरे घर के कंप्यूटर पर:

perl -MSocket -le 'socket(S, PF_INET, SOCK_DGRAM, getprotobyname("udp"));
connect(S, sockaddr_in(1, inet_aton("8.8.8.8")));
print inet_ntoa((sockaddr_in(getsockname(S)))[1]);'

इंटरफ़ेस के आईपी पते का पता लगाने के लिए उपयोग किया जाएगा जिसके माध्यम से मैं 8.8.8.8 (Google के DNS सर्वर) तक पहुंच जाएगा। यह "192.168.1.123" की तरह कुछ लौटाएगा जो इंटरनेट के लिए डिफ़ॉल्ट मार्ग के लिए इंटरफ़ेस का पता है। हालाँकि, Google मेरी मशीन से एक DNS अनुरोध नहीं देख रहा है क्योंकि वह उस आईपी पते से आ रहा है जो एक निजी है, जैसा कि NAT ने मेरे होम ब्रॉडबैंड राउटर द्वारा किया है।

UDP सॉकेट पर कनेक्ट () किसी भी पैकेट को नहीं भेजता (UDP कनेक्शन-कम है), लेकिन रूटिंग टेबल को क्वेरी करके सॉकेट तैयार करता है।


7
ipa=$(ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g')

ipa=$(hostname -i|cut -f2 -d ' ')

1
-Iइसके बजाय का उपयोग करना -iबेहतर है क्योंकि आप लूपबैक ipa=$(hostname -I|cut -f1 -d ' ')
आदतों

1
यदि grepपर्याप्त नहीं है, तो इसे किसी और चीज़ पर न डालें। बस कुछ और (का उपयोग sed, awkआदि)।
ब्रूनो ब्रोंस्की

7

मैं एक झटका होने का मतलब नहीं है, लेकिन वास्तव में एक सही तरीका है और यह है। आप ip routeकेवल स्रोत IP प्राप्त करने के लिए आउटपुट ट्रिम करते हैं । आप जिस आईपी तक पहुंचने की कोशिश कर रहे हैं, उसके आधार पर "मेरा अपना आईपी पता" (ओपी के शब्द) अलग होंगे। यदि आप सार्वजनिक इंटरनेट तक पहुंचने की परवाह करते हैं, तो Google के 8.8.8.8 DNS सर्वर का उपयोग करना बहुत मानक है। इसलिए...

संक्षिप्त उत्तर है:

ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'

यहां विस्तृत विवरण दिया गया है

अगर मुझे इंटरनेट तक पहुंचने के लिए उपयोग होने वाले आईपी चाहिए , तो मैं इसका उपयोग करता हूं:

pi@et3:~ $ ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
10.55.0.200

अगर मुझे अपने वीपीएन पर किसी चीज़ तक पहुँचने के लिए उपयोग होने वाले आईपी चाहिए , तो मैं इसका उपयोग करता हूं:

pi@et3:~ $ ip route get 172.31.0.100 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
172.29.0.9

यह अगले एक सच में सिर्फ उदाहरण के लिए है। लेकिन, यह किसी भी लिनक्स सिस्टम पर काम करना चाहिए। तो, आप इसका उपयोग यह प्रदर्शित करने के लिए कर सकते हैं कि, हां, सभी मशीनों में हर समय कई आईपी पते हैं।

अगर मुझे वह आईपी चाहिए जो मैं खुद तक पहुँचने के लिए उपयोग करूँ , तो मैं इसका उपयोग करूँगा :

pi@et3:~ $ my_ip=$(getent hosts $(cat /etc/hostname) | awk '{print $1; exit}')
pi@et3:~ $ ip route get $my_ip | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
127.0.0.1

उस sedआदेश के बारे में अधिक

पहले मुझे यह कहना चाहिए कि यूनिक्स उपकरण चुनते समय, आप उन उपकरणों को चुनने की कोशिश करते हैं जिनमें सबसे कम पाइप की आवश्यकता होती है। तो, जबकि कुछ जवाब पाइप होगा ifconfigकरने के लिए grepकरने के लिए sedकरने के लिए head, कि शायद ही कभी आवश्यक है। जब आप इसे देखते हैं, तो इसे एक लाल झंडा उठाना चाहिए जिसे आप किसी के अनुभव से सलाह ले रहे हैं। यह "समाधान" को गलत नहीं बनाता है। लेकिन, यह शायद कुछ सुव्यवस्थित उपयोग कर सकता है।

मैंने चुना है sedक्योंकि यह उसी वर्कफ़्लो की तुलना में अधिक सुस्पष्ट है awk। (मैं नीचे एक अजीब उदाहरण के बाद से है।) मैं किसी भी अन्य उपकरण नहीं लगता है, लेकिन उन 2 उपयुक्त होगा।

आइए देखें कि क्या sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'होता है:

sed            # the sed executable located via $PATH
-n             # no output unless explicitly requested
'              # begin the command space
/src/          # regex match the string 'src'
{              # begin a block of commands **
s/             # begin a substitution (match)
  .*src *      # match anything leading up to and including src and any number of spaces
  \([^ ]*\)    # define a group containing any number of non spaces
  .*           # match any trailing characters (which will begin with a space because of the previous rule).
/              # begin the substitution replacement
  \1           # reference the content in the first defined group
/              # end the substitution
p              # print (explicitly, remember) the result
;              # designate the end of the command
q              # quit
}              # end the block of commands
'              # end the command space

** all of which will be performed "on match"
  - otherwise only the first command to following the match would be performed "on match"
    - any other commands would be performed whether there was a match or not
ध्यान दें:

मैं उपयोग करता था sed -n '/src/{s/.*src *//p;q}'लेकिन एक टिप्पणीकार ने बताया कि कुछ सिस्टम में srcफ़ील्ड के बाद डेटा अनुगामी है ।

जाग का उपयोग करना

ip route get 8.8.8.8 | \
    awk '{gsub(".*src",""); print $1; exit}'

# or

ip route get 8.8.8.8 | \
    awk '{for(i=1; i<NF; i++){if($i=="src"){i++; print $i; exit}}}'

मेरे नेटवर्क के बारे में अधिक

मेरा ifconfigपता चलता है कि मुझे tun0अपने वीपीएन के लिए और eth0अपने लैन के लिए है।

pi@et3:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.55.0.200  netmask 255.255.252.0  broadcast 10.55.3.255
        inet6 fe80::71e6:5d7c:5b4b:fb25  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:b2:96:84  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 172.29.0.9  netmask 255.255.255.255  destination 172.29.0.10
        inet6 fe80::3a8e:8195:b86c:c68c  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:e7:c3:d1  txqueuelen 1000  (Ethernet)

ip route get 8.8.8.8 | sed -n '/src/{s/.*src *//p;q}'मुझे दिया 10.1.2.3 uid 1002। इसलिए मैं | awk '{print $1}'केवल आईपी पता रखने के लिए एपेंड करता हूं ।
वारबीस

@wisbucky मैं कभी भी दर्ज कोड में एक दूसरे को sed / awk / grep पाइप नहीं करता। (मैं जल्दी में होने पर कमांड लाइन पर इसका उपयोग करूंगा, लेकिन आप इसे मेरे ~ / .bash_history के अलावा डिस्क के लिए लिखा हुआ कभी नहीं पाएंगे) मैंने awk का उपयोग करने के उत्तर को अपडेट किया और यह इस समस्या को हल करता है।
ब्रूनो ब्रोंस्की

1
@wisbucky मैं इसे बर्दाश्त नहीं कर सकता। मैंने आपके पर्यावरण के साथ भी मेरा काम किया है।
ब्रूनो ब्रोंस्की

2

FreeBSD पर आप उपयोग कर सकते हैं

dig +short `hostname -f`

यह अन्य वातावरणों के लिए काम कर सकता है, आपके सेट-अप पर निर्भर करता है।


मेरा मानना ​​है कि यह /etc/resolv.confकैसे और कैसे नेटवर्क राउटर स्थानीय होस्टनामों के विन्यास पर निर्भर है । यदि आप इसका परीक्षण करते हैं और यह काम करता है तो अपने वातावरण में इसका उपयोग करना ठीक है । लेकिन अगर आप ऐसा करते हैं, तो आप एक "भंगुर" प्रणाली का निर्माण कर रहे हैं जो आपके द्वारा साझा किए जाने पर दूसरों की समस्याओं का कारण बनने जा रही है। सावधानी से प्रयोग करें।
ब्रूनो ब्रोंस्की

2

यह मानते हुए कि आपके पास विभिन्न नाम के विभिन्न इंटरफेस हो सकते हैं, लेकिन आप पहले गैर-लोकलहोस्ट एक और गैर-आईपीवी 6 चाहते हैं, तो आप कोशिश कर सकते हैं:

ip=`ip addr show |grep "inet " |grep -v 127.0.0. |head -1|cut -d" " -f6|cut -d/ -f1`

ip = $ (ifconfig | grep -oP '(! <= inet addr:) \ S *' | grep -v 127)
rcjohnson

1

मैं इस एक लाइनर का उपयोग करता हूं:

IP=$(/sbin/ifconfig | grep -e "inet:" -e "addr:" | grep -v "inet6" | grep -v "127.0.0.1" | head -n 1 | awk '{print $2}' | cut -c6-)

उपयोग ifconfig(व्यापक रूप से उपलब्ध), localhostपते को नहीं लेता है , आपको किसी दिए गए इंटरफ़ेस नाम से बाँधता नहीं है, आईपीवी 6 को ध्यान में नहीं रखता है और पहले नेटवर्क इंटरफ़ेस का आईपी प्राप्त करने की कोशिश करता है।


1
myip=$(curl -kLs "http://api.ipify.org")

या

myip=$(wget -q "http://api.ipify.org" -O -)

1

आपको 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}'  

0

मुझे अपने वायर्ड एनआईसी पर एक रेडियो सर्वर शुरू करने के लिए एक उपनाम के भीतर ऐसा करने की आवश्यकता थी। मैंनें इस्तेमाल किया

ip addr | egrep -i "inet.+eth1" | awk -F[\ /] '{print $6}' | tr -d [:space:]

egrepमूल्यह्रास किया गया है grep -Eइसके बजाय उपयोग करें ।
योकाई २५'१: को

0

कुछ कमांड सेंटोस 6 या 7 पर काम कर रहे हैं, दोनों पर काम करने वाले कमांड,

#!/bin/sh

serverip=`/sbin/ifconfig eth0 | grep "inet" | awk '{print $2}' | awk 'NR==1' | cut -d':' -f2`

echo $serverip

यह बहुत ज्यादा रास्ता है grep | awk | awk। लाइन को छोटा किया जा सकता है/sbin/ifconfig eth0 | awk '$1 == "inet" { print substr($2,6); next ; } '
आर्किमर

मैंने स्वीकार किया, क्या आप सेंटोस 6 और 7 दोनों की जांच कर सकते हैं? सेंटो 7.x / sbin / ifconfig eth0 | awk '$ 1 == "inet" {प्रिंट पदार्थ ($ 2,6); आगे ; } '35.104.41 centos6.x (वर्किंग फाइन) / sbin / ifconfig eth0 | awk '$ 1 == "inet" {प्रिंट पदार्थ ($ 2,6); आगे ; } '192.168.0.1
लक्ष्मीकंदन

0

यह मानते हुए कि आपको अपनी प्राथमिक सार्वजनिक IP की आवश्यकता है जैसा कि बाकी दुनिया से देखा गया है , उनमें से कोई भी प्रयास करें:

wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip

0

यह स्निपेट डिवाइस के नाम (जैसे 'eth0') को हार्ड-कोडिंग से बचाता है और ipइसके बजाय उपयोग करेगा ifconfig:

/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'

यह आउटपुट में सूचीबद्ध पहले सक्रिय डिवाइस का आईपी लौटाएगा ip addr। आपकी मशीन के आधार पर, यह एक आईपीवी 4 या आईपीवी 6 पता हो सकता है।

इसे चर में संग्रहीत करने के लिए, उपयोग करें:

ip=$(/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')

0

awk / sed / grep का उपयोग करने वाले सभी समाधान मेरी स्थिति के लिए अत्यधिक जटिल और बदसूरत लगते हैं ... इसलिए मैं वास्तव में इस सरल समाधान के साथ आया हूँ लेकिन खबरदार यह कुछ धारणाएँ बनाता है, अर्थात यह अनुमान कि LAST इंटरफ़ेस वह है जो आप हैं रुचि। यदि आप इसके साथ ठीक हैं तो यह बहुत साफ है:

ifconfig | awk '/net / { x = $2 } END { print x }'

अन्यथा आप ifएक विशिष्ट उपसर्ग या आपके पास जो भी मानदंड हो, परीक्षण करने के लिए कुछ मूर्खतापूर्ण बयान कर सकते हैं।


0

डिफ़ॉल्ट इंटरफ़ेस के साथ आईपी पते को ठीक करने के लिए सरल कमांड।

ip route | grep src | awk '{print $NF; exit}'

सभी यूनिक्स ओएस पर परीक्षण किया गया


0

यह सबसे मजबूत या सही समाधान नहीं हो सकता है, लेकिन अधिकांश अन्य समाधानों के विपरीत, कमांड लिनक्स और मैक (बीएसडी) दोनों पर काम करता है।

host `hostname` | awk '{print $NF}'

0

यदि आप बॉक्स के सार्वजनिक आईपी पते की तलाश कर रहे हैं , तो आप निम्नलिखित का उपयोग कर सकते हैं:

  • dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \"

आप dig(1)जैसे विकल्प का उपयोग कर सकते हैं -4या -6विशेष रूप से IPv4 या IPv6 पते की तलाश कर सकते हैं; Google एक TXTप्रकार के रिकॉर्ड में एक उत्तर प्रदान करेगा , जिसके द्वारा प्रस्तुत किए जाने पर इसके चारों ओर उद्धरण होंगे dig; यदि आप बाद में उपयोगिताओं जैसे चर का उपयोग करना चाहते हैं traceroute, तो आप उक्त उद्धरणों को हटाने के लिए tr (1) जैसी किसी चीज़ का उपयोग करेंगे ।

अन्य विकल्पों में शामिल हैं whoami.akamai.netऔर myip.opendns.com, जो ( Google से उपरोक्त उदाहरण के बजाय) रिकॉर्ड Aऔर AAAAरिकॉर्ड TXTकरते हैं, इसलिए, उन्हें उद्धरणों की आवश्यकता नहीं है:

  • dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

  • dig -4 @resolver1.opendns.com -t any myip.opendns.com +short

  • dig -6 @resolver1.opendns.com -t any myip.opendns.com +short

यहां एक नमूना स्क्रिप्ट है जो चर सेट करने के लिए उपरोक्त सभी विकल्पों का उपयोग करता है:

#!/bin/sh
IPANY="$(dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv4="$(dig -4 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv6="$(dig -6 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
AKAMv4="$(dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short)"
CSCOv4="$(dig -4 @resolver1.opendns.com -t a myip.opendns.com +short)"
CSCOv6="$(dig -6 @resolver1.opendns.com -t aaaa myip.opendns.com +short)"
printf '$GOOG:\t%s\t%s\t%s\n' "${IPANY}" "${GOOGv4}" "${GOOGv6}"
printf '$AKAM:\t%s\n$CSCO:\t%s\t%s\n' "${AKAMv4}" "${CSCOv4}" "${CSCOv6}"

यदि आप एक निजी IP पता के लिए देख रहे हैं, या बॉक्स करने के लिए आवंटित सभी IP पतों का एक सेट के लिए, आप में से कुछ संयोजन इस्तेमाल कर सकते हैं ifconfig, (BSD और जीएनयू / लिनक्स पर) ip addr(जीएनयू / लिनक्स पर), hostname(विकल्प -iऔर -Iपर GNU / Linux) और netstatयह देखने के लिए कि क्या चल रहा है।


-2
hostname -I >> file_name 

यह वह सब कुछ करेगा जो आप चाहते हैं


hostname: invalid option -- 'l'...
जसोनव्रीयन

वह एक राजधानी है। ठीक काम करने लगता है, हालांकि यह स्पष्ट रूप से सभी इंटरफेस के आईपी पते प्रिंट करता है।
जो

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