बैश स्क्रिप्ट में यूनिक्स पर पूरी तरह से योग्य नाम (FQN) कैसे प्राप्त करें?


15

मैंने hostnameकई सर्वरों (रेडहैट, उबंटू) पर परीक्षण किया है , और hostname -fअविश्वसनीय साबित हुआ है, केवल कुछ समय में नाम वापस लौट रहा है (जैसा कि इस प्रश्न में वर्णित है )।

मैं उपनामों को उपनामों में देख सकता हूं: hostname -a(उपनामों में से एक fqn है जिसकी मैं तलाश करता हूं), लेकिन उपनामों का क्रम तय नहीं है।

क्या पूरी तरह से योग्य नाम को मज़बूती से प्राप्त करने के लिए एक और तरीका है, और इसे बैश वेरिएबल में स्टोर करें?


यदि कभी-कभी CNAME वह है जो आप देख रहे हैं और A- रिकॉर्ड नहीं, तो आप कैसे जानते हैं कि "सही" FQN है?
निल्स

जवाबों:


11

मैंने CentOS5 पर यह कोशिश की:

host -TtA $SERVERNAME|grep "has address"|awk '{print $1}'

मुझे अपने DNS को TCP-Mode में क्वेरी करना है। यदि आपके वातावरण में यूडीपी काम करता है तो "T" विकल्प छोड़ दें।


नोट: उबंटू अतिथि (वर्चुअलबॉक्स) पर यह काम नहीं करेगा:

git@aHostname:~/$ host -TtA $(hostname -s)
Host aHostname not found: 3(NXDOMAIN)

तो सभी मामलों को कवर करने के लिए:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"

1
मुझे host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'अपने रेडहैट सर्वरों पर काम करना शुरू हो गया
VonC

यह मैक ओएसएक्स 10.11.6 पर काम करता है, हालांकि प्रति आईपी एक लाइन देता है, लेकिन ओएसएक्स 10.12.1 पर नहीं। मुझे यकीन नहीं है कि यह मेरी मशीन की स्थापना या स्वाभाविक रूप से v12 पर विफल रहता है।
ऐनीएजाइल

अपडेट करें; AD LDAP का उपयोग करते हुए मैक के लिए, सबसे आसान तरीका पार्स करना है: dsconfigad -show
AnneTheAgile

5

यहाँ एक तरीका है जो मैंने पाया fqn:

fqn=$(nslookup $(hostname -i)) ; fqn=${fqn##*name = } ; fqn=${fqn%.*} ; echo $fqn

दूसरे शब्दों में, मुझे nslookupआईपी ​​एड्रेस देना था, जो मुझे कुछ इस तरह देता है:

Server:         128.xxx.yyy.zzz
Address:        128.xxx.yyy.zzz#ww

aa.bb.cc.dd.in-addr.arpa        name = myserver.fully.qualified.name.

वहां से, यह केवल बैश स्ट्रिंग जोड़तोड़ के माध्यम से जो मैं नहीं चाहता था, उसे हटाने का सवाल था ।

शायद एक सरल तरीका है?


5

आपकी विधि केवल तभी काम करती है जब आपने अपने होस्टनाम को सही ढंग से कॉन्फ़िगर किया हो, और सही डीएनएस सेटिंग्स हों, आदि। यदि आपके पास वह सब है, तो आप पहले से ही अपने fqdn को जानते हैं।

Fqdn प्राप्त करने के लिए कोई विश्वसनीय तरीका नहीं है। एक एकल IP पते में कई fqdn हो सकते हैं, और एक एकल fqdn में कई IP पते हो सकते हैं ... और बहुत सारे IP में कोई भी fqdn नहीं है।

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


यह सच है, लेकिन मेरे संदर्भ में (विश्व व्यापी उद्यम), मेरे सभी सर्वरों में एक fnn है, और सही dns सेटिंग्स हैं। जिन सर्वरों की मुझे जरूरत है, उनमें केवल एक ही fqdn होना चाहिए।
VonC

तो hostकेवल ए-रिकॉर्ड प्राप्त करने के लिए उत्तर को पार्स करें (या एक अनुसार लुकअप करें)।
नेल्स

@ निल्स: यह एक अच्छा सुझाव है। क्या आप इसे उत्तर दे सकते हैं, मेरे लिए उत्थान और (परीक्षण के बाद) स्वीकार करना?
VonC

5

hostname --fqdnआपके लिए काम नहीं करता है ?


नहीं, जैसा कि प्रश्न में स्पष्ट रूप से कहा गया है। सर्वरों पर मुझे FQDN जानकारी प्राप्त करनी है, hostname --fqdnलघु नाम लौटाता है, जिसमें fqdn को होस्टनाम गैसों में से एक के रूप में परिभाषित किया गया है।
वॉनक

ओह ठीक है, मुझे एहसास नहीं हुआ -fऔर --fqdnयही बात है।
ThatGraemeGuy


2

क्रॉस-प्लेटफ़ॉर्म विकल्प के लिए, यदि आपको अजगर का उपयोग करने में कोई आपत्ति नहीं है (कम से कम अजगर 2.7 और अजगर 3 पर रन)

python -c 'import socket; print(socket.getfqdn())'

-1

एक ओएस एक्स सुरक्षित बैश केवल विधि, जो संभवत : कमांड आउटपुट में भिन्नता के कारण अन्य * निक्स स्वादों को काम नहीं करेगी :

fqn=$(nslookup $(hostname) | sed -n s/Name:.//p);

व्यापक अनुकूलता के लिए अजगर आपकी सबसे अच्छी शर्त है।

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