मैं चाहता हूँ कि Ubuntu एक DHCP क्लाइंट से होस्टनाम और DNS नाम प्राप्त करे । Ubuntu 11.10 (Oneiric Ocelot) की डिफ़ॉल्ट स्थापना ऐसा नहीं करती है।
मैं चाहता हूँ कि Ubuntu एक DHCP क्लाइंट से होस्टनाम और DNS नाम प्राप्त करे । Ubuntu 11.10 (Oneiric Ocelot) की डिफ़ॉल्ट स्थापना ऐसा नहीं करती है।
जवाबों:
यहाँ वर्णित के रूप में dhcp हुक के लिए थोड़ी स्क्रिप्ट के साथ इसे करने का एक तरीका है ।
एक नई फ़ाइल बनाएँ:
sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname
और निम्नलिखित कोड पेस्ट करें:
#!/bin/sh
# Filename: /etc/dhcp/dhclient-exit-hooks.d/hostname
# Purpose: Used by dhclient-script to set the hostname of the system
# to match the DNS information for the host as provided by
# DHCP.
#
# Do not update hostname for virtual machine IP assignments
if [ "$interface" != "eth0" ] && [ "$interface" != "wlan0" ]
then
return
fi
if [ "$reason" != BOUND ] && [ "$reason" != RENEW ] \
&& [ "$reason" != REBIND ] && [ "$reason" != REBOOT ]
then
return
fi
echo dhclient-exit-hooks.d/hostname: Dynamic IP address = $new_ip_address
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -r 's/((.*)[^\.])\.?/\1/g' )
echo $hostname > /etc/hostname
hostname $hostname
echo dhclient-exit-hooks.d/hostname: Dynamic Hostname = $hostname
बदलें eth0
और wlan0
उन इंटरफेस के नामों से जिनसे आप होस्टनाम प्राप्त करना चाहते हैं। ज्यादातर मामलों में eth0
और wlan0
एक ही रहना चाहिए।
सुनिश्चित करें कि यह पठनीय है ...
chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname
बस इतना ही। अगली dhcp प्रतिक्रिया पर आपका होस्टनाम अपने आप अपडेट हो जाएगा।
आप अपने होस्टनाम को अपने डीएचसीपी सर्वर से प्राप्त कर सकते हैं - यह डीएचसीपी विनिर्देश का हिस्सा है।
https://tools.ietf.org/html/rfc1533#section-3.14
"यह विकल्प क्लाइंट का नाम निर्दिष्ट करता है"
d_inevitable के उत्तर ने मेरी समस्या को लगभग हल कर दिया, लेकिन पूरी तरह से नहीं। समस्या यह थी कि हालांकि:
DHCP सर्वर होस्टनाम भेज रहा था (सर्वर को जोड़कर
option host name 'client1'
dhcpd.conf में) और मैंने वास्तव में तारों के साथ डीएचसीपी प्रस्ताव की सामग्री को कैप्चर और विश्लेषण करके इसे सत्यापित किया है।
DHCP क्लाइंट DHCP सर्वर से होस्टनाम की उम्मीद कर रहा था (जोड़कर
request host-name
dhclient.conf में)
क्लाइंट को एक नया होस्टनाम नहीं मिल रहा था (टाइप करके आसानी से सत्यापित किया गया
hostname
टर्मिनल में और पुराने होस्टनाम को प्राप्त करना, या कोई होस्टनाम नहीं है यदि मैंने सामग्री / फ़ाइल को हटा दिया है)। परिणामस्वरूप, d_inevitable द्वारा प्रस्तावित समाधान केवल एक रिक्त स्ट्रिंग की प्रतिलिपि बना रहा था।
इसे हल करने के लिए, मैंने एक क्रूड समाधान लागू किया, जिसे आम तौर पर तब तक पालन नहीं किया जाना चाहिए जब तक कि आप इसे काम करने के लिए बेताब न हों, जैसे मैं था।
सबसे पहले, DHCP क्लाइंट कंट्रोल स्क्रिप्ट को संपादित करने की क्षमता के साथ खोलें:
sudo vi /sbin/dhclient-script
वहां, आपको फ़ंक्शन का पता लगाना होगा
set_hostname()
बस खोज का उपयोग करें और इसे सही आना चाहिए। अब, कम से कम मेरे कंप्यूटर पर, इस फ़ंक्शन में तीन अगर-और-स्थितियां हैं, तो एक-दूसरे के लिए समझाया गया है:
# सेट होस्ट नाम set_hostname () {स्थानीय current_hostname
if [ -n "$new_host_name" ]; then current_hostname=$(hostname) # current host name is empty, '(none)' or 'localhost' or differs from new one from DHCP if [ -z "$current_hostname" ] || [ "$current_hostname" = '(none)' ] || [ "$current_hostname" = 'localhost' ] || [ "$current_hostname" = "$old_host_name" ]; then if [ "$new_host_name" != "$old_host_name" ]; then hostname "$new_host_name" fi fi fi }
अब, आपको अपनी होस्ट को नए होस्टनाम के असाइनमेंट के लिए बाध्य करने की आवश्यकता है, चाहे जो भी हो। इसलिए आप इन दोनों को अलग-थलग करना चाहते हैं, अगर-तब-तब। परिणाम कुछ इस तरह दिखना चाहिए:
# सेट होस्ट नाम set_hostname () {स्थानीय current_hostname
if [ -n "$new_host_name" ]; then current_hostname=$(hostname) # current host name is empty, '(none)' or 'localhost' or differs from new one from DHCP #if [ -z "$current_hostname" ] || # [ "$current_hostname" = '(none)' ] || # [ "$current_hostname" = 'localhost' ] || # [ "$current_hostname" = "$old_host_name" ]; then # if [ "$new_host_name" != "$old_host_name" ]; then hostname "$new_host_name" # fi #fi fi }
अब d_inevitable या यह उम्मीद के अनुसार काम करना चाहिए। आशा है कि मदद करता है यदि आप एक समान हताशा में थे जैसा कि मैं था।
अन्य उत्तरों के अनुसार, और एक RHEL7 प्रणाली पर मेरे हाल के अनुभव से भी, ओली का उत्तर डेस्ट्रस्ट्रली झूठा है ("आप अपने होस्टनाम को डीएचसीपी सर्वर से प्राप्त नहीं करते हैं")। कहा प्रणाली को डीएचसीपी सर्वर से अपना होस्ट नाम मिला है।
और, वास्तव में, डीएचसीपी कॉन्फ़िगरेशन फ़ाइलों में कुछ चीजें हैं जो इसे बनाने वाली हैं। उदाहरण के लिए:
host host4 { # verified
hardware ethernet 41:88:22:11:33:22;
fixed-address 192.168.0.4;
option host-name "host4";
}
उस मेजबान को बताने वाला है कि उसका नाम host4 है।
जैसा कि यह पता चला है, इस के समर्थन के लिए isc की घिनौना नहीं है!
हालाँकि, dhcpcd5 बॉक्स से बाहर है। Dhclient बंद करें, dhcpcd5 स्थापित करें, dhcpcd चलाएं, अपने पट्टे को नवीनीकृत करें, और poof, अपने DHCP क्लाइंट पर आपका होस्टनाम DHCP सर्वर से भेजे गए नाम पर सेट है। कोई dhclient-exit-hooks.d
स्क्रिप्टिंग, कोई हैक rc.local
नहीं, कुछ भी नहीं।
एक अंत-नोट के रूप में, मैंने ISC के dhclient का उपयोग करके इसे प्राप्त करने की कोशिश में बहुत समय बिताया है। जब सर्वर होस्ट नाम भेजता है, तब भी कोई खुशी नहीं है।
समस्या का मेरा प्रारंभिक समाधान यह rc.local
पता लगाने के लिए कुछ प्यारा कोड लिख रहा था कि नेटवर्क कब आया और /etc/hosts
होस्टनाम प्राप्त करने और फिर hostname
उस होस्ट नाम से चलने के लिए (मेरे मामले में) खोज के लिए मजबूर किया गया । यह काम करता है, लेकिन जब तक नेटवर्क नहीं आता है तब तक आपका होस्टनाम शायद गलत है (जब पहली बार एक होस्ट की तैनाती करते हैं /etc/hostname
, तो मैं हटा देता हूं , इसलिए होस्ट का नाम localhost
तब तक है जब तक कि मैं /etc/init.d/hostname.sh start
एक बार नेटवर्क के ऊपर नहीं आ सकता - तब जब पहला नया नाम आपको बूट करने की आवश्यकता हो दो बार - एक बार अपना होस्टनाम प्राप्त करने के लिए, और एक बार सब कुछ शुरू होने पर उस नाम को उपलब्ध करने के लिए ...)।
आप अपने होस्टनाम को डीएचसीपी सर्वर से प्राप्त नहीं करते हैं।
आप अपने होस्टनाम को सर्वर पर भेज सकते हैं , जो आपके द्वारा असाइन किए गए आईपी को बदल सकता है। आप अपने नेटवर्क प्रबंधक कनेक्शन (फ़ील्ड को डीएचसीपी क्लाइंट आईडी कहा जाता है) को संपादित करके या तो नाम भेजा जा सकता है या आप (रूट के रूप में) संपादित कर सकते हैं /etc/dhcp/dhclient.conf
। लाइन के लिए देखो जो कहता है:
send host-name "<hostname>";
... और <hostname>
जो भी आपको पसंद हो उसे बदलें ।
डिफ़ॉल्ट रूप से उबंटू राउटर से अपनी DNS सेटिंग्स प्राप्त करेगा (यदि यह उन्हें भेजता है), लेकिन मुझे संदेह है कि आप एल ocal DNS / mDNS के बारे में बात कर रहे हैं जहां आप अपने होस्टनाम द्वारा अन्य कंप्यूटरों तक पहुंच सकते हैं। इसे उबंटू में अहवी या ज़राकोनफ कहा जाता है और यह डिफ़ॉल्ट रूप से स्थापित होता है।
आपको अपने कंप्यूटर तक पहुंचने में सक्षम होना चाहिए <hostname>.local
hostname
और डोमेन द्वारा इस असाइन किए गए होस्टनाम को देखने में सक्षम होना चाहिए hostname -d
। इसलिए यह fqdn hostname.domain होना चाहिए
send host-name "example.com";
, तो आप केवल एक के साथ अनुरोध कर सकते हैं request host-name;
।
अगर पाया गया कि एक dhcpclient स्क्रिप्ट बग हो सकती है। http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
IP नवीकरण पर $ old_host_name को साफ़ करने का प्रयास करें
इको अनसेट ओल्ड_होस्ट_नाम> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname
इसके अलावा स्थिर / etc / hostname को dhcp के उत्तर पर बहुत अच्छा लगता है इसलिए इसे खाली छोड़ दें
> / etc / hostname
Ubuntu 14.04 और dnsmasq सर्वर पर परीक्षण किया गया।
ध्यान दें कि उबंटू 18.04 का उपयोग करते समय टाई-इन स्क्रिप्ट आवश्यक नहीं हैं। स्थापित की होस्ट नाम पर सेट है localhost
में /etc/hostname
DHCP क्लाइंट, नाम डीएचसीपी द्वारा जारी किए गए का उपयोग कर यदि वर्तमान स्टार्टअप पर स्वचालित रूप से होस्ट नाम सेट हो जाएगा। hostnamectl
इसे चलाते localhost
समय स्थायी होस्टनाम के रूप में सूचीबद्ध किया जाएगा , और जो भी डीएचसीपी एक क्षणिक होस्टनाम के रूप में जारी करेगा।
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
उत्तर इस बात पर निर्भर करता है कि आप अपने डीएचसीपी सर्वर पर स्थिर पट्टों का उपयोग कर रहे हैं या नहीं। यदि आप हैं, तो DNS से होस्टनाम प्राप्त करना अनावश्यक है। आप इस लाइन को d_inevitable के समाधान में बदल सकते हैं
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
सेवा
hostname=${new_host_name}
लेकिन यह स्वचालित रूप से होना चाहिए, यदि आपका होस्टनाम मूल रूप से लोकलहोस्ट.लोकलोमेन पर सेट है, तो आपको स्क्रिप्ट लिखने की जरूरत नहीं है। हालाँकि, यदि आप होस्टनाम को FQDN पर सेट करना चाहते हैं, तो आपको d_inevitable की स्क्रिप्ट को बदलना होगा
hostname=${new_host_name}.${new_domain_name}
फिर, यह सब केवल तभी काम करता है जब आप स्थैतिक पट्टों का उपयोग कर रहे हों।
टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन मैं पिछले उत्तर पर गुल्लक-वापसी करना चाहूंगा क्योंकि यह लगभग मेरे लिए एक समस्या का हल निकालता है, जो एक dhclient हुक का उपयोग कर रहा है।
मैंने पाया है कि किसी कारण के लिए मानक ISC DHCP सर्वर का उपयोग करते हुए, उपर्युक्त हुक एक 'के साथ होस्ट नाम का आउटपुट देता है।' किसी कारण से होस्टनाम के अंत में अवधि वर्ण।
इसलिए, पिछले उत्तर में आपको एक सेड के साथ बाहरी अवधि को "कट आउट" करने की आवश्यकता हो सकती है:
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
बन जाएगा:
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
host
में असाइन किए गए IP पते से जुड़े होस्टनाम को निकालने के लिए DNS क्वेरी ( कमांड का उपयोग करके ) का उपयोग करती है। डीएचसीपी सर्वर वास्तव में होस्ट नाम विकल्प (विकल्प 12) को स्पष्ट रूप से सेट कर सकते हैं, जो संभावित रूप से आईपी पर डीएनएस क्वेरी से प्राप्त होस्टनाम से अलग हो सकता है (यह संभवतः भी विफल हो सकता है, अगर आईपी के लिए कोई पीटीआर रिकॉर्ड डीएनएस पर मौजूद नहीं है। )