DHCP सर्वर से होस्टनाम कैसे प्राप्त करें


17

मैं चाहता हूँ कि Ubuntu एक DHCP क्लाइंट से होस्टनाम और DNS नाम प्राप्त करे । Ubuntu 11.10 (Oneiric Ocelot) की डिफ़ॉल्ट स्थापना ऐसा नहीं करती है।

यही सवाल पूछा गया और उबंटू फ़ोरम पर अनसुलझा है

जवाबों:


6

यहाँ वर्णित के रूप में 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 प्रतिक्रिया पर आपका होस्टनाम अपने आप अपडेट हो जाएगा।


यह स्क्रिप्ट वास्तव hostमें असाइन किए गए IP पते से जुड़े होस्टनाम को निकालने के लिए DNS क्वेरी ( कमांड का उपयोग करके ) का उपयोग करती है। डीएचसीपी सर्वर वास्तव में होस्ट नाम विकल्प (विकल्प 12) को स्पष्ट रूप से सेट कर सकते हैं, जो संभावित रूप से आईपी पर डीएनएस क्वेरी से प्राप्त होस्टनाम से अलग हो सकता है (यह संभवतः भी विफल हो सकता है, अगर आईपी के लिए कोई पीटीआर रिकॉर्ड डीएनएस पर मौजूद नहीं है। )
एले

4

आप अपने होस्टनाम को अपने डीएचसीपी सर्वर से प्राप्त कर सकते हैं - यह डीएचसीपी विनिर्देश का हिस्सा है।

https://tools.ietf.org/html/rfc1533#section-3.14

"यह विकल्प क्लाइंट का नाम निर्दिष्ट करता है"


3
इसे भेजने के लिए आपको सर्वर कैसे मिलेगा?
ओलाथे

3

d_inevitable के उत्तर ने मेरी समस्या को लगभग हल कर दिया, लेकिन पूरी तरह से नहीं। समस्या यह थी कि हालांकि:

  1. DHCP सर्वर होस्टनाम भेज रहा था (सर्वर को जोड़कर

    option host name 'client1' 
    

    dhcpd.conf में) और मैंने वास्तव में तारों के साथ डीएचसीपी प्रस्ताव की सामग्री को कैप्चर और विश्लेषण करके इसे सत्यापित किया है।

  2. 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 या यह उम्मीद के अनुसार काम करना चाहिए। आशा है कि मदद करता है यदि आप एक समान हताशा में थे जैसा कि मैं था।


3

अन्य उत्तरों के अनुसार, और एक 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एक बार नेटवर्क के ऊपर नहीं आ सकता - तब जब पहला नया नाम आपको बूट करने की आवश्यकता हो दो बार - एक बार अपना होस्टनाम प्राप्त करने के लिए, और एक बार सब कुछ शुरू होने पर उस नाम को उपलब्ध करने के लिए ...)।


1

आप अपने होस्टनाम को डीएचसीपी सर्वर से प्राप्त नहीं करते हैं।

आप अपने होस्टनाम को सर्वर पर भेज सकते हैं , जो आपके द्वारा असाइन किए गए आईपी को बदल सकता है। आप अपने नेटवर्क प्रबंधक कनेक्शन (फ़ील्ड को डीएचसीपी क्लाइंट आईडी कहा जाता है) को संपादित करके या तो नाम भेजा जा सकता है या आप (रूट के रूप में) संपादित कर सकते हैं /etc/dhcp/dhclient.conf। लाइन के लिए देखो जो कहता है:

send host-name "<hostname>";

... और <hostname>जो भी आपको पसंद हो उसे बदलें ।


डिफ़ॉल्ट रूप से उबंटू राउटर से अपनी DNS सेटिंग्स प्राप्त करेगा (यदि यह उन्हें भेजता है), लेकिन मुझे संदेह है कि आप एल ocal DNS / mDNS के बारे में बात कर रहे हैं जहां आप अपने होस्टनाम द्वारा अन्य कंप्यूटरों तक पहुंच सकते हैं। इसे उबंटू में अहवी या ज़राकोनफ कहा जाता है और यह डिफ़ॉल्ट रूप से स्थापित होता है।

आपको अपने कंप्यूटर तक पहुंचने में सक्षम होना चाहिए <hostname>.local


मेरे नेटवर्क पर dns और dhcp (windows 2008) सर्वर है। चींटी यह hostname असाइन करती है और प्रत्येक ip को नाम डीएनएस करती है, लेकिन ubuntu इसे होस्टनाम और डीएनएस नाम अपडेट नहीं करता है। मैं टाइप करके hostnameऔर डोमेन द्वारा इस असाइन किए गए होस्टनाम को देखने में सक्षम होना चाहिए hostname -d। इसलिए यह fqdn hostname.domain होना चाहिए
Oguz Bilgic

AFAIR यदि क्लाइंट विंडोज डोमेन में शामिल नहीं होता है, तो विंडोज डीएचसीपी सर्वर विंडोज DNS प्रविष्टियों को गतिशील रूप से अपडेट नहीं करेगा। मैं वास्तव में निश्चित नहीं हूँ ... पर निर्भर करता है विंडोज डीएचसीपी / डीएनएस कॉन्फ़िगरेशन
20 नवंबर को

डिफ़ॉल्ट रूप से 12.04 में यह पंक्ति है "होस्ट-नाम = gethostname () भेजें;" और आप कमांड लाइन पर "hostname" लिखकर उस मान को देख सकते हैं। डिफ़ॉल्ट रूप से, इसका विंडोज़ नेटवर्क पर कोई प्रभाव नहीं पड़ेगा। मूल प्रश्न के अनुसार।
3

हालांकि zeroconf डिफ़ॉल्ट रूप से स्थापित है, यह बहुत ही अविश्वसनीय है। जब यह काम करता है, तो मुझे स्पष्ट रूप से आश्चर्य होता है कि होस्टनाम या hostname.local पिंगिंग के रूप में शायद ही कभी सफलता मिलती है, हालांकि महीनों में मेरे नेटवर्क पर कुछ भी नहीं बदला है।
सेरिन

1
यह बिल्कुल सच नहीं है। जब आप एक विशिष्ट IP पता प्राप्त करने के लिए अपने होस्ट नाम को डीएचसीपी सर्वर पर भेज सकते हैं send host-name "example.com";, तो आप केवल एक के साथ अनुरोध कर सकते हैं request host-name;
दिमित्री ग्रिगोरीव

1

अगर पाया गया कि एक 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 सर्वर पर परीक्षण किया गया।


1

ध्यान दें कि उबंटू 18.04 का उपयोग करते समय टाई-इन स्क्रिप्ट आवश्यक नहीं हैं। स्थापित की होस्ट नाम पर सेट है localhostमें /etc/hostnameDHCP क्लाइंट, नाम डीएचसीपी द्वारा जारी किए गए का उपयोग कर यदि वर्तमान स्टार्टअप पर स्वचालित रूप से होस्ट नाम सेट हो जाएगा। hostnamectlइसे चलाते localhostसमय स्थायी होस्टनाम के रूप में सूचीबद्ध किया जाएगा , और जो भी डीएचसीपी एक क्षणिक होस्टनाम के रूप में जारी करेगा।

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname

0

उत्तर इस बात पर निर्भर करता है कि आप अपने डीएचसीपी सर्वर पर स्थिर पट्टों का उपयोग कर रहे हैं या नहीं। यदि आप हैं, तो 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}

फिर, यह सब केवल तभी काम करता है जब आप स्थैतिक पट्टों का उपयोग कर रहे हों।


0

टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन मैं पिछले उत्तर पर गुल्लक-वापसी करना चाहूंगा क्योंकि यह लगभग मेरे लिए एक समस्या का हल निकालता है, जो एक 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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.