पहले / आदि / होस्ट का उपयोग करके होस्ट नामों को हल करने के लिए लिनक्स कमांड लाइन उपयोगिता


36

वहाँ संकल्प होस्ट नाम (करने के लिए कई कमांड लाइन उपयोगिताओं हैं host, dig, nslookup), लेकिन वे सभी उपयोग नेमसर्वर विशेष रूप से, थोड़ी देर में सामान्य रंग-रूप में आवेदन पत्र /etc/hosts(मेरा मानना है कि gethostbyname का प्रयोग करके) पहले।

क्या होस्ट नामों को हल करने के लिए एक कमांड लाइन उपयोगिता है जो एक सामान्य अनुप्रयोग की तरह व्यवहार करती है, इस प्रकार /etc/hostsपहले और फिर केवल एक नेमसर्वर से पूछ रही है?

(मुझे पता है कि यह शायद सी की 3 लाइनों की तरह होगा, लेकिन मुझे इसकी आवश्यकता कुछ हद तक पोर्टेबल शेल स्क्रिप्ट के अंदर है।)


क्या आप कृपया अपनी स्थिति को थोड़ा और समझा सकते हैं? awk '/hostname/ { print $1 }' /etc/hostsमदद करता है?
क्वांटा

@quanta वास्तव में वर्तमान समाधान grep / sed पर / etc / मेजबानों पर जादू है। मैं कमबैक के साथ इसे और सामान्य बनाना चाहता था।
ज़ुल्लान

जवाबों:


56

यह आसानी से प्राप्त होता है getent:

getent hosts 127.0.0.1

getentमें कॉन्फ़िगर किए गए किसी भी प्रकार के डेटा के लिए लुकअप करेंगे nsswitch.conf


यह वह उपकरण है जो मैं अपने अल्पाइन डॉकटर कंटेनरों में उपयोग करता हूं, जिनके पास digया जैसा कोई अन्य तंत्र नहीं है nslookup
ब्रूनो ब्रोंस्की

26

एक उपकरण जो काम करेगा getent। तो आप उपयोग कर सकते हैं getent hosts www.google.com, या getent hosts localhost। यह आपके नाम सेवा स्विच कॉन्फ़िगरेशन में निर्दिष्ट डेटाबेस से प्रविष्टियों को पुनः प्राप्त करेगा /etc/nsswitch.conf


1
हां, लेकिन यह DNS पर वापस नहीं आएगा।
धीमी गति से

नहीं, यह इसे nsswitch.conf क्रम में हल करता है।
cjc

@slowpoison, अपने nsswitch कॉन्फ़िगरेशन पर एक नज़र डालें। मेरा सिस्टम files dnsमेजबानों के लिए है, जिसका अर्थ है / आदि / मेजबानों से परामर्श किया जाता है और फिर DNS रिज़ॉल्वर। आपका कॉन्फ़िगरेशन भिन्न हो सकता है।
२०:०२ पर जोर्डैच

@cjc, यह करता है। मुझे नहीं लगता कि मैंने इसे सही तरीके से आजमाया है।
धीमी गति से

@Zoredache, मैं काफी प्रभावित हूँ getent। इस कमांड के परिचय के लिए धन्यवाद।
धीमी गति से

8

आप एक gethostbyname () (पदावनत) आवरण का उपयोग कर सकते हैं जैसे:

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

या एक getaddrinfo () आवरण:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

ध्यान दें कि getaddrinfo सभी उदाहरणों को एक सूची के रूप में वापस करेगा। कमांड का अंतिम भाग केवल पहले टपल का चयन करता है। यह IPv6 पते भी लौटा सकता है।


1
यह काम करेगा, लेकिन यह कुछ समय के लिए अप्रचलित है। Linux.die.net/man/3/gethostbyname देखें ।
काइल स्मिथ

धन्यवाद, मुझे इसकी जानकारी नहीं थी। ;)
मिर्चे वुटकोविसी

एक उत्थान है। कोई अन्य अर्ध-पोर्टेबल वन-लाइनर प्रस्तावित नहीं किया गया है।
user239558

यदि यह किसी और के लिए मूल्य का है, तो मैंने कुछ कमांड-लाइन विकल्पों के साथ पायथन 3 संस्करण बनाया: github.com/acdha/unix_tools/blob/master/bin/getaddrinfo
क्रिस

6

resolveip यह करेंगे।

अजीब तरह से, यह आरएचईएल और उबंटू पर mysql- सर्वर पैकेज का हिस्सा है।


6

आप एक स्क्रिप्ट लिखने के लिए [अपनी पसंदीदा भाषा यहां] का उपयोग कर सकते हैं जो getnameinfo को बुलाता है । यही कारण है कि बायनेरिज़ (पिंग की तरह) इसे करना चाहिए, इसलिए आपको सुनिश्चित किया जाता है कि आप एक ही उपचार प्राप्त करें।


6

getent ahostsउदाहरण के लिए, उपयोग करें :

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

आप सभी IPv4 और IPv6 पते, glibc रिसॉल्वर के माध्यम से प्राप्त करेंगे (इस प्रकार /etc/hostsपहले का उपयोग कर , जैसा कि आमतौर पर कॉन्फ़िगर किया गया है /etc/nsswitch.conf)।

उपयोग न करें getent hosts, क्योंकि यह आपको IPv6 या IPv4 पते (दोनों नहीं) देगा, और चुना हुआ प्रोटोकॉल एक नहीं हो सकता है जो काम नहीं करता है। दरअसल, IPv6 पतों को आमतौर पर पसंद किया जाता है, लेकिन कुछ स्थानों पर, राउटर द्वारा IPv6 डेटा को फ़िल्टर (समर्थित नहीं) किया जाता है।



2

आप वास्तव में हैकी हो सकते हैं और उपयोग कर सकते हैं arp:

arp -n somehostname | tr -d '()' | awk '{print $2}'

लेकिन यह वास्तव में बदसूरत होगा इसलिए आपको ऐसा नहीं करना चाहिए।


2

getent hostsटूट गया है। यह IPv6 पतों gai.confको प्राथमिकता देता है , इसे ipv4 पसंद करने के लिए कॉन्फ़िगर किया जाना चाहिए लेकिन ...।

पर्ल gethostbynameपूर्वता का उपयोग करता है/etc/nsswitch.conf

hosts: files dns

तो इस तरह काम करता है getent hostsमेरे लिए काम करना चाहिए।

इसके अलावा:

perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

कार्य करना चाहिए।


5
यह टूटा नहीं है, यह सिर्फ getaddrinfo (जो /etc/gai.conf पढ़ता है) का उपयोग नहीं करता है। Getaddrinfo का उपयोग करने के लिए, चलाएं getent ahosts
१०:३५ बजे क्रेग ६५५३५

1

इसे इस्तेमाल करे:

if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then
    ip=`awk '/hostname/ { print $1 }' /etc/hosts`
else
    ip=`host hostname | awk '/hostname has address/ { print $4 }'`
fi

-1

निम्न आदेश DNS / etc / host के माध्यम से प्रत्यक्ष DNS सर्वर लुकअप के माध्यम से लुकअप प्रदर्शन करेंगे।

ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/"

यह कमांड 2 सेकंड के प्रतीक्षा समय के साथ एक डोमेन (इस मामले में, google.com) एक बार पिंग करने का प्रयास करेगी, पिंग कमांड की पहली पंक्ति प्राप्त करें जो "पिंग google.com (216.58.199.36) 56 (84) को बताएगी ) डेटा का बाइट्स ", फिर ब्रैकेट्स के पहले सेट का पता लगाने के लिए स्ट्रीम एडिटर (sed) का उपयोग करें और इसके भीतर डेटा निकालें जो कि आईपी एड्रेस है जिसे हम खोज रहे हैं।

ध्यान दें: यदि URL में कोष्ठक (उर्फ परिपत्र कोष्ठक) हैं, तो रेगेक्स एक्सप्रेशन काम नहीं करेगा, लेकिन यह एक दुर्लभ मामला होगा।

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