मैं एक बैश स्क्रिप्ट में IP पते पर होस्टनाम कैसे हल कर सकता हूं?


416

बैश स्क्रिप्ट में IP पते पर होस्टनाम को हल करने का सबसे संक्षिप्त तरीका क्या है? मैं आर्क लिनक्स का उपयोग कर रहा हूं ।


21
शर्म की बात है कि इसका getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>जवाब नीचे कहीं है। यह सबसे सरल है, किसी अतिरिक्त पैकेज की आवश्यकता नहीं है और बैश स्क्रिप्ट से पार्स करना भी आसान है।
0xC0000022L

1
@ 0xC0000022L: नई शर्म की बात है कि है कि इसका जवाब पता चलता है getent hosts somehost, जब यह चल रहा है , जबकि परsomehost एक IPv6 पता उत्पादन करेगा , जो कि सबसे अन्य उपकरणों (से अलग है ping, sshकम से कम) के नाम को हल, और कुछ चीजें टूट जाता है। के ahostsबजाय का उपयोग करें hosts
j_random_hacker

@j_random_hacker: जो आपको विशेष रूप से IPv4 ( ahostsv4) या IPv6 ( ahostsv6) पतों का अनुरोध करने से रोकता है ? व्यक्तिगत रूप से मुझे IPv6 को वापस करने के अनिर्दिष्ट अनुरोध के साथ कुछ भी गलत नहीं लगता है। आपका कोड तैयार होना चाहिए। IPv6 अब वहाँ 20 से अधिक वर्षों के लिए बाहर कर दिया गया है।
0xC0000022L

@ 0xC0000022L: कोई भी मुझे ऐसा करने से रोकता है, लेकिन जवाब विशेष रूप से बताता है hosts, और अब तक 4 लोगों ने vinc17 की टिप्पणी को "अचानक IPv6" के कारण होने वाले दर्द को व्यक्त किया है। IPv6 के लिए तैयार रहना हमेशा मुद्दा नहीं होता है: कई कार्यक्रमों को यह निर्धारित करने के लिए एक तरीके की आवश्यकता होती है कि क्या दो नाम / पते एक ही मेजबान को संदर्भित करते हैं। वे या तो सरल स्ट्रिंग मिलान का उपयोग कर सकते हैं, या उन्हें "सही" उत्तर खोजने के लिए नेटवर्क के बारे में बहुत कुछ जानना चाहिए। उत्तरार्द्ध एक मेरा क्षेत्र है, इतने सारे तृतीय-पक्ष कार्यक्रम और सिस्टम - जिनका मेरे पास कोई नियंत्रण नहीं है - पूर्व का उपयोग करें।
j_random_hacker

जवाबों:


533

आप उपयोग कर सकते हैं getent, जो glibcआपके साथ आता है (इसलिए आप लगभग निश्चित रूप से लिनक्स पर हैं)। यह gethostbyaddr / gethostbyname2 का उपयोग करके हल करता है, और इसलिए /etc/hosts/ NIS / etc की भी जाँच करेगा :

getent hosts unix.stackexchange.com | awk '{ print $1 }'

या, जैसा कि नीचे हेंजज़ी ने कहा है, आप तर्क के digसाथ उपयोग कर सकते हैं +short(DNS सर्वरों से सीधे पूछताछ करते हैं, /etc/hosts/ NSS / etc पर नज़र नहीं डालते हैं):

dig +short unix.stackexchange.com

यदि dig +shortअनुपलब्ध है, तो निम्न में से कोई भी काम करना चाहिए। ये सभी क्वेरी DNS को सीधे और रिज़ॉल्यूशन के अन्य साधनों को अनदेखा करते हैं:

host unix.stackexchange.com | awk '/has address/ { print $4 }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 }'

यदि आप केवल एक आईपी प्रिंट करना चाहते हैं, तो exitकमांड को awkवर्कफ़्लो में जोड़ें।

dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'

2
डिफ़ॉल्ट रूप से, डिग का उपयोग केवल ipv4 के साथ काम करता है, जहां होस्ट ipv4 और ipv6 दोनों उत्तर देता है। यह अप्रत्याशित हो सकता है। आप कोशिश कर सकते हैं host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com, dig +short www.facebook.com
jfg956

6
DIG काम नहीं करता है, अगर CNAME है तो वह IP वापस नहीं करेगा।
सोरिन

4
कभी-कभी, hostसमय समाप्त हो सकता है और कुछ भी नहीं देता है। कुछ डोमेन के लिए, dig +shortपहली पंक्ति में डोमेन उपनाम वापस कर सकते हैं। तो, यह सुनिश्चित करने के लिए कि आउटपुट एक आईपीवी 4 पता है, उपयोग करें dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1
caiguanhao

9
उपयोग करना getent hosts <host>गलत है, उदाहरण के लिए, यह IPv6 पता दे सकता है जबकि IPv6 काम नहीं करता है। getent ahosts <host>यदि आवश्यक हो तो IPv6 और IPv4 दोनों का उपयोग करने के लिए सही समाधान का उपयोग करना है।
vinc17 15

5
वर्थ उल्लेख: मेजबान, खुदाई और nslookup resolv.conf में सूचीबद्ध सर्वरों से सीधे बात करता है, जबकि "गेट्ट होस्ट" सक्षम होने पर स्थानीय होस्ट फ़ाइल और लाइब्रेरी-स्तरीय कैशिंग (जैसे nscd) दोनों का सम्मान करते हैं।
सायसुप

141

साथ hostसे dnsutils पैकेज:

$ host unix.stackexchange.com
unix.stackexchange.com has address 64.34.119.12

( टिप्पणियों के अनुसार सही पैकेज का नाम। नोट के रूप में अन्य वितरणों hostमें अलग-अलग पैकेज हैं: डेबियन / उबंटू बाइंड 9-होस्ट , ओपनसाइड बाइंड- बर्तन, फ्रुगलवेयर बाइंड ।)


4
क्या आपका मतलब डंसुटिल्स था ? वैसे भी, hostअच्छा काम किया, धन्यवाद
यूजीन यमश

शायद तुम सही हो। जांच के लिए मेरे पास यहां कोई आर्क नहीं है। (बाद में इसका उल्लेख करते हुए एक टिप्पणी को जोड़ने का इरादा था, लेकिन जवाब पहले से ही उखाड़ दिया गया था, इसलिए मुझे लगा कि मैंने इसे
भुनाया है

1
यदि आपको DNS में कुछ नहीं हल करने की आवश्यकता है, तो नीचे दी गई रिज़ॉल्यूशन प्रविष्टि देखें (उदाहरण / आदि / होस्ट)
Gavin Brock

2
ध्यान रखें कि hostकभी-कभी मल्टी-लाइन आउटपुट (रीडायरेक्ट के मामले में) लौटाता है, host unix.stackexchange.com | tail -n1यदि आप आईपी पते के साथ लाइन चाहते हैं तो आप चाहेंगे।
एडवर्ड कॉफ़ी

3
यह उत्तर एक गंभीर गिरावट का हकदार है। hostएक DNS उपकरण (समान nslookup) है, इसलिए यह केवल DNS में होस्ट दिखता है, उदाहरण के लिए नहीं /etc/hosts। तो यह ओपी के सवाल का जवाब नहीं है
पीटर

54

मेरे पास मेरी मशीन पर एक उपकरण है जो काम करने के लिए लगता है। मैन पेज दिखाता है कि यह mysql के साथ आता है ... यहाँ बताया गया है कि आप इसका उपयोग कैसे कर सकते हैं:

resolveip -s unix.stackexchange.com
64.34.119.12

यदि होस्टनाम हल नहीं किया जा सकता है तो इस टूल का रिटर्न मान 0 से अलग है:

resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2

अद्यतन फेडोरा पर, यह mysql- सर्वर के साथ आता है:

yum provides "*/resolveip"
mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files
Dépôt         : fedora
Correspondance depuis :
Nom de fichier      : /usr/bin/resolveip

मुझे लगता है कि यह आपकी स्क्रिप्ट के लिए एक अजीब निर्भरता पैदा करेगा ...


6
यह यहाँ पर एकमात्र समाधान प्रतीत होता है जो ओएस के बिल्ड को रिज़ॉल्वर में उपयोग करता है - इसलिए / etc / मेजबान के साथ-साथ DNS के लिए भी काम करता है।
गैविन ब्रॉक

8
getent, जैसा कि अन्य उत्तर में विस्तृत है, भी / etc / मेजबान को देखता है, और glibc के साथ आता है, इसलिए लिनक्स सिस्टम पर कोई निर्भरता नहीं है।
असफंद काजी

44

निम्नलिखित कमांड का उपयोग करके digआप बिना किसी sed / awk / etc के सीधे परिणाम पढ़ सकते हैं। जादू:

$ dig +short unix.stackexchange.com
64.34.119.12

digभी dnsutilsपैकेज में शामिल है ।


नोट : digका रिटर्न मान है 0, भले ही नाम हल न किया जा सके। इस प्रकार, आपको यह जांचने की आवश्यकता होगी कि क्या रिटर्न मान की जाँच करने के बजाय आउटपुट खाली है:

hostname=unix.stackexchange.com

ip=`dig +short $hostname`

if [ -n "$ip" ]; then
    echo IP: $ip
else
    echo Could not resolve hostname.
fi

नोट 2 : यदि एक होस्टनाम में कई आईपी पते हैं ( debian.orgउदाहरण के लिए प्रयास करें ), तो वे सभी वापस आ जाएंगे। यह "समस्या" इस प्रश्न में अब तक वर्णित सभी साधनों को प्रभावित करती है:


2
ध्यान दें कि यदि किसी डोमेन में CNAME प्रविष्टि है, तो उसका डोमेन IP पते के बजाय पहली पंक्ति में मुद्रित हो सकता है।
pcworld

40
getent hosts unix.stackexchange.com | cut -d' ' -f1

4
भी विचार ahosts, ahostsv4, ahostsv6साथ getent
0xC0000022L

cutप्राप्त करने के लिए नहीं होगा, जो \tअलग कॉलम का उपयोग करते हैं। यही हाल सोलारिस पर है।
ceving

1
@ इस्चिंग: सोलारिस पर आपको cutबिना भाग के -d(चूक को \tसीमांकक) करना पड़ सकता है । लिनक्स पर यह रिक्त स्थान है, इस प्रकार ऊपर की रेखा काम करती है।
sborsky

27

अब तक दिए गए समाधान ज्यादातर सरल मामले में काम करते हैं: होस्टनाम सीधे एक एकल आईपीवी 4 पते पर हल होता है। यह एकमात्र ऐसा मामला हो सकता है जहां आपको होस्टनामों को हल करने की आवश्यकता होती है, लेकिन यदि नहीं, तो नीचे कुछ मामलों पर चर्चा की जा सकती है जिन्हें आपको संभालने की आवश्यकता हो सकती है।

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

$ host www.l.google.com
www.l.google.com has address 209.85.148.147
www.l.google.com has address 209.85.148.103
www.l.google.com has address 209.85.148.99
www.l.google.com has address 209.85.148.106
www.l.google.com has address 209.85.148.105
www.l.google.com has address 209.85.148.104

लेकिन क्या है www.l.google.com? यह वह जगह है जहाँ उपनाम मामले को पेश करने की आवश्यकता है। आइए नीचे दिए गए उदाहरण की जाँच करें:

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.105
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104

इसलिए www.google.comसीधे आईपी पतों का समाधान नहीं करता है, लेकिन एक ऐसे उपनाम के लिए जो स्वयं कई आईपी पतों को हल करता है। उपनामों के बारे में अधिक जानकारी के लिए, यहां देखें । बेशक, जिस मामले में एक उपनाम का एक एकल आईपी पता संभव है, जैसा कि नीचे दिखाया गया है:

$ host g.www.ms.akadns.net
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.190

लेकिन क्या एलियास जंजीर हो सकता है? इसका जवाब है हाँ:

$ host www.microsoft.com
www.microsoft.com is an alias for toggle.www.ms.akadns.net.
toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net.
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.254

$ host www.google.fr
www.google.fr is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104
www.l.google.com has address 74.125.39.105

मुझे ऐसा कोई उदाहरण नहीं मिला जहां एक होस्टनाम एक उपनाम के लिए हल करता है जो एक आईपी पते पर हल नहीं होता है, लेकिन मुझे लगता है कि मामला हो सकता है।

कई IP पते और उपनाम से अधिक, क्या कुछ अन्य विशेष मामले हैं ... IPv6 के बारे में क्या है? तुम कोशिश कर सकते हो:

$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:8007::68

जहाँ hostname ipv6.google.comएक IPv6- केवल hostname है। दोहरे स्टैक होस्टनाम के बारे में क्या:

$ host www.facebook.com
www.facebook.com has address 66.220.153.15
www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c::

IPv6 के बारे में, यदि आपका होस्ट केवल IPv4 है, तो भी आप IPv6 पतों (IPv4 पर केवल WinXP पर परीक्षण किया गया और IPv6.google.com के साथ, आप इसे लिनक्स पर आज़मा सकते हैं) को हल कर सकते हैं। इस स्थिति में, रिज़ॉल्यूशन सफल होता है, लेकिन अज्ञात होस्ट त्रुटि संदेश के साथ पिंग विफल हो जाता है । यह एक ऐसा मामला हो सकता है जहां आपकी स्क्रिप्टिंग विफल हो जाती है।

मुझे उम्मीद है कि वे टिप्पणियां उपयोगी थीं।


2
सभी उत्तर मामलों को दिखाते हुए स्वीकार किए गए उत्तर के लिए एक महान पूरक है, जो स्क्रिप्टिंग में निपटना चाहते हैं। मेरा संस्करण hostमेरे बक्से के लिए "पता" भी नहीं बताता है।
मिहाई दानिला

21

उपनाम के साथ समस्या से बचने के लिए और हमेशा उपयोग के लिए एक ही आईपी पता तैयार करें:

python -c 'import socket; print socket.gethostbyname("www.example.com")'

मैंने इस उत्तर से अपने बैशकैश
Bryce

18
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

अन्य प्रणालियों पर निर्भरता के बिना काम करता है (और / etc / मेजबान में निर्दिष्ट मेजबानों के लिए)


2
पिंग का उपयोग मुझे क्या चाहिए क्योंकि मुझे होस्ट फ़ाइल से मान की आवश्यकता है लेकिन sed पैटर्न सही ढंग से पार्स हो रहा है लेकिन यह काम पिंग -q -c 1 -t 1 your_host_here | grep पिंग | sede -e "s / ^ [^ () * [() //" | sed -e "s / /)).*$//"
ManiacZX

1
Myhostname.local जैसे मेरे होम नेटवर्क पर कुछ हल करने के लिए यह मेरे लिए सबसे अच्छा जवाब है।
मैट फ्रीडमैन

1
मई मैं यह भी सुझाव देता हूं:ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
मैट फ्रेडमैन

getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>अंदर /etc/hostsभी घोषणाओं के लिए काम करता है ... और यह सभी तरह के सिस्टम डेटाबेस (पासव्ड, ग्रुप, एलियास, सर्विसेज) के लिए गो-टू-टूल है।
0xC0000022L

17

सरल लेकिन उपयोगी:

  1. getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  2. getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  3. getent hosts google.de | head -n 1 | cut -d ' ' -f 1

यदि होस्ट अभी भी मौजूद है, तो सभी कमांड एक आईपी पते को हल करेंगे। यदि CNAME की मेजबानी की जाती है तो उस स्थिति में भी इसे IP मिलेगा।

पहला आदेश हल किया गया IPv4 पता लौटाता है

दूसरा आदेश हल किया गया IPv6 पता लौटाता है

तीसरा आदेश IPv4 या IPv6 पते के मालिक के पसंदीदा पते को लौटाएगा।


अब तक सबसे सरल। और डिफ़ॉल्ट रूप से इसका लाभ। ऐसा नहीं है hostकि bindutils
michaelbn

7

यहाँ pingदृष्टिकोण की थोड़ी भिन्नता है जो "अज्ञात होस्ट" को खाते में ले जाती है (स्टडर के माध्यम से पाइपिंग करके) और रेगेक्स के उपयोग trसे बचने के लिए उपयोग करता है sed:

ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

यदि बाहर निकलने के मूल्य पर कब्जा करना महत्वपूर्ण है, तो निम्नलिखित काम करेगा (हालांकि कम सुरुचिपूर्ण):

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

मुझे यह समाधान पसंद है, क्योंकि यह बिना किसी अतिरिक्त उपकरण के काम करता है।
Radon8472

7

क्रिस डाउन के उत्तर को पूरा करने के लिए, और (संभवतः जंजीर वाले) उपनामों के बारे में jfgagne टिप्पणियों को संबोधित करें, यहां एक समाधान है कि:

  • कई आईपी को ध्यान में रखता है
  • एक या अधिक उपनाम (CNAME) को ध्यान में रखता है
  • /etc/hostsफ़ाइल को क्वेरी नहीं करता (मेरे मामले में मैं यह नहीं चाहता था); इसे क्वेरी करने के लिए, dbernt का अजगर समाधान सही है)
  • awk / sed का उपयोग नहीं करता है

    dig +short www.alias.com  | grep -v "\.$" | head -n 1

हमेशा हल नहीं होने पर पहला IP पता, या खाली ट्रिंग लौटाता है। खुदाई के संस्करण के साथ:

    $ dig -v
    DiG 9.8.1-P1

1
धन्यवाद, अन्य उत्तर मान लेते हैं कि "डिजी + शॉर्ट" हमेशा एक ही आईपी एड्रेस देता है। वे CNAME के ​​लिए लेखांकन नहीं थे।
जामशीद

5
 php -r "echo gethostbyname('unix.stackexchange.com');"

यह काम करता है, लेकिन इसके लिए आवश्यक है कि आपके टर्मिनल पर php स्थापित हो
Radon8472

1
एक विशिष्ट php docker कंटेनर पर उपयोगी हो सकता है जहाँ "host", "dig" आदि उपलब्ध नहीं हैं
Fabian Schmengler

5

मैं इसे एंड्रयू मैकग्रेगर रे: पिंग की टिप्पणी के रूप में जोड़ना चाहूंगा। हालाँकि, यह मुझे नहीं जाने देता, इसलिए मुझे इसे दूसरे उत्तर के रूप में जोड़ना होगा। (यदि कोई इसे टिप्पणी में स्थानांतरित कर सकता है, तो बेझिझक।)

यह एक और संस्करण है, केवल पिंग और grep का उपयोग कर:

ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"

grep -Eविस्तारित नियमित अभिव्यक्ति के लिए और grep -oकेवल मिलान वाले भाग को वापस करने के लिए। regexp अपने आप में एक या कई अंकों ( [0-9]+) और वैकल्पिक रूप से एक डॉट ( \.?) चार बार ( {4}) के लिए दिखता है


4

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

hostname=example.org

# strips the IP
IP=$( host ${hostname} | sed -e "s/.*\ //" )

# checks for errors
if [ $? -ne 0 ] ; then
   echo "Error: cannot resolve ${hostname}" 1>&2
   exit 1;
fi

4

यहाँ एक बैश नुस्खा है जिसे मैंने अन्य लोक के उत्तरों का उपयोग करके पकाया है - पहले कोशिश करता है /etc/hosts, फिर nslookup में वापस आता है:

resolveip(){
    local host="$1"
    if [ -z "$host" ]
    then
        return 1
    else
        local ip=$( getent hosts "$host" | awk '{print $1}' )
        if [ -z "$ip" ] 
        then
            ip=$( dig +short "$host" )
            if [ -z "$ip" ]
            then
                echo "unable to resolve '$host'" >&2 
                return 1
            else
                echo "$ip"
                return 0
            fi
        else
            echo "$ip"
            return 0
        fi
    fi
}

स्पष्ट है कि, getent hostsबस / etc / hosts में एक देखने नहीं है - यह है पूर्ण DNS-हल करने कॉल करने के लिए एक gethostbyaddr (3) , और यह है बहुत एक मामले में जहां में असफल होने की संभावना नहीं digसफल होगा। पाने के लिए मैन पेज देखें ।
स्टुअर्ट पी। बेंटले

@ स्टुअर्ट सही है - मैंने यह लिखने के बाद से बहुत कुछ सीखा है और एक शक्तिशाली कमांड की देखरेख की है। getentमेरा पसंदीदा बना हुआ है, हालाँकि मुझे भी पसंद हैdig +short
RubyTuesdayDONO

4
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

डीएनएस सर्वर के बिना मुझे मिला समाधान था


3

शायद सबसे संक्षिप्त नहीं है, लेकिन यह मजबूत और कुशल लगता है:

# $(get_host_dns_short "google.com")
#
# Outputs the IPv4 IP Address of a hostname, resolved by DNS. Returns 0 if DNS
# responded successfully; 1 otherwise. Will mask error output.
function get_host_dns_short()
{
    (
        set -o pipefail

        host -4 -W1 -t A "$1" 2>/dev/null | awk '/has address/ { print $NF; exit }'
    ) && return 0 || return 1
}

यह एक एकल आईपीवी 4 आईपी का उत्पादन करेगा, साथ ही 1विफलता की स्थिति में लौटेगा , जबकि स्टैडर आउटपुट को मास्किंग करेगा।

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

GOOGLE_IP="$(get_host_dns_short "google.com")"
if [[ $? -eq 0 ]]; then
    echo "Google's IP is ${GOOGLE_IP}."
else
    echo "Failed to resolve Google's IP."
fi

Google का IP 216.58.192.46 है।

यदि आप इसके बजाय एक IPv6 पता चाहते हैं, तो बस के -4साथ बदलें -6


3

dig +noall +answer +nocomments example.com | awk '{printf "%-36s\t%s\n", $1, $5 }'


1
उस संदर्भ में कुछ संदर्भ जो पहले से मौजूद लोगों की तुलना में उत्तर को बेहतर बनाते हैं। इसके अलावा, कृपया 4 रिक्त स्थान (सीएफ। मार्कडाउन सिंटैक्स) द्वारा आज्ञा दें।
मैक्सक्लेपजिग

2

1 लाइन होस्टनाम की एक सूची को हल करती है

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk '/^Address: / { print $1 }');  echo $a >> ~/Desktop/ip; done

2

मैं अपने मैक पर हर समय ऐसा कर रहा हूं जो नहीं है getentpingएक हैक की तरह लगता है। मैं इसे भी ध्यान /etc/hostsमें रखना चाहूंगा ।

इसलिए, मैंने dns.lookupआपके लिए एक बेवकूफ रैपर लिखा है जिनके पास एक CLI प्रदान करने के लिए Node.js स्थापित है:

$ npm install -g lookup-hostname
$ lookup google.com
62.243.192.89

एक समाधान के पास कहीं भी पहुंचने से पहले टूटने की संभावना 60%।
डॉट

@dotbit आप विस्तृत कर सकते हैं? मैंने '17 के बाद से इस साप्ताहिक का उपयोग किया है और कभी भी कोई मुद्दा नहीं था।
थॉमस जेन्सेन

@ जेन्सेन लेकिन आप हमेशा की तरह केवल एक ही बार हैं। हम में से बाकी आमतौर पर एक तरह या दूसरे की असफलता में चलते हैं, और हमेशा।
डॉट

"हमेशा की तरह" इससे आपका क्या मतलब है? "हम में से बाकी" कौन है? "रन इन फेल" आप किस विशिष्ट मुद्दे को देख रहे हैं? मैं उत्सुक हूँ।
थॉमस जेन्सेन


2

मुझे बैश-स्क्रिप्ट का सबसे आसान तरीका नहीं पता है, लेकिन यदि आप एक होस्टनाम को हल करना चाहते हैं और देखें कि क्या होस्ट ऊपर है, उपयोग करें ping!

ping -a hostname -c 1

विल pingमेजबान एक बार और आईपी पते को होस्टनाम का समाधान।

$ ping -a www.google.com -c 1
PING www.google.com (216.58.211.132) 56(84) bytes of data.
64 bytes from arn09s10-in-f4.1e100.net (216.58.211.132): icmp_seq=1 ttl=54 time=1.51 ms

पिंग का उपयोग करना अच्छा है, क्योंकि हर किसी के पास है, लेकिन आपको आउटपुट से आईपी-पार्ट को फ़िल्टर करने की आवश्यकता है, यदि आप इसे किसी स्क्रिप्ट में उपयोग करना पसंद करते हैं।
Radon8472

1

हां, पहले से ही कई उत्तर हैं, लेकिन पर्ल का उपयोग कर एक समाधान गायब है:

perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com

बैश स्क्रिप्ट में इसे इस तरह इस्तेमाल किया जा सकता है:

#!/bin/bash
ipaddr=$(perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com)
echo $ipaddr

यहां उपयोग किए गए मॉड्यूल कोर मॉड्यूल हैं, इसलिए सीपीएएन के साथ स्थापित किए बिना हर जगह उपलब्ध होना चाहिए।


perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null ज्यादा साफ है। लेकिन कोई भी नहीं है, लेकिन हम दोनों pörl का उपयोग कर रहे हैं, बाकी सभी लोग पास्कल स्क्रिप्ट का उपयोग करते हैं।
12

वास्तव में मैं त्रुटि संदेशों को देखना पसंद करता हूं अगर कुछ भी गलत हो जाता है। Can't call method "addr" on an undefined valueवास्तव में सबसे अच्छा त्रुटि संदेश नहीं है, लेकिन समस्या के बारे में संकेत दे सकता है।
स्लावेन रेजिक

1
#!/bin/bash

systemd-resolve   RT.com -t A  | awk '{ print $4 ; exit }'
systemd-resolve unix.stackexchange.com -t A --legend=no | awk '{ print $4 ; exit }'

resolveip -s      RT.com
dig       +short  RT.com
host              RT.com | awk '/has address/ { print $4 }'
nslookup          RT.com | awk '/^Address: /  { print $2 }'
ping -q -c 1 -t 1 RT.com | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

ruby     -rresolv -e      ' print    Resolv.getaddress "RT.com" '
python2  -c 'import socket; print socket.gethostbyname("RT.com")'
perl     -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' RT.com  2>/dev/null
php      -r "echo gethostbyname( 'RT.com' );"

echo        "   all do work for me - take your pick!  "

1
माणिक संस्करण प्रिंट आईपी पते के आसपास उद्धरण करता है --- शायद printइसके बजाय का उपयोग किया जाना चाहिए p
स्लावेन रेजिक

thx, @ सैल्वेन रेज़िक और बेझिझक अपडाउन करते हैं। फिर से, यहाँ नीचे की पटकथा वास्तव में अधिक दिखाई दे सकती है ... ;-)
dotbit

-1
host -t a cisco.com

यह कमांड आईपी एड्रेस दिखाएगा (आईपी को डोमेन फिर से भेज देगा)


-1

उपरोक्त समाधान के अलावा, आप स्क्रिप्ट के नीचे से कई होस्ट नाम का आईपी में अनुवाद कर सकते हैं, एकमात्र निर्भरता कोर यूनिक्स में "पिंग" कमांड है:

getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }

getip 'hostname.number1.net'

getip 'hostname.number2.net'

getip 'hostname.number3.net'

getip 'hostname.number4.net'

getip 'hostname.number5.net'

getip 'hostname.number6.net'

getip 'hostname.number7.net'

getip 'hostname.number8.net'
$ cat /tmp/result.log

ABC.DEF.GHI.XY1

ABC.DEF.GHI.XY2

ABC.DEF.GHI.XY3

ABC.DEF.GHI.XY4

ABC.DEF.GHI.XY5

ABC.DEF.GHI.XY6

ABC.DEF.GHI.XY7

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