วิธีรับชื่อโฮสต์จากเซิร์ฟเวอร์ DHCP


17

ฉันต้องการ Ubuntu เพื่อรับชื่อโฮสต์และชื่อ DNS จากไคลเอนต์DHCP การติดตั้งเริ่มต้นของ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 ครั้งต่อไปชื่อโฮสต์ของคุณจะอัปเดตโดยอัตโนมัติ


สคริปต์นี้ใช้แบบสอบถาม DNS (ใช้hostคำสั่ง) เพื่อแยกชื่อโฮสต์ที่เกี่ยวข้องกับที่อยู่ IP ที่กำหนด เซิร์ฟเวอร์ DHCP สามารถตั้งค่าตัวเลือกชื่อโฮสต์ (ตัวเลือก 12) ได้อย่างชัดเจนซึ่งอาจแตกต่างจากชื่อโฮสต์ที่คุณได้รับจากการสืบค้น DNS บน IP (ซึ่งอาจเกิดความล้มเหลวได้หากไม่มีเรคคอร์ด PTR สำหรับ IP อยู่บน DNS )
Ale

4

คุณสามารถรับชื่อโฮสต์จากเซิร์ฟเวอร์ DHCP ของคุณซึ่งเป็นส่วนหนึ่งของข้อกำหนด DHCP

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

"ตัวเลือกนี้ระบุชื่อลูกค้า"


3
คุณจะให้เซิร์ฟเวอร์ส่งได้อย่างไร
โอเลเท

3

คำตอบของ d_inevitable เกือบแก้ปัญหาของฉันได้ แต่ไม่สมบูรณ์ ปัญหาคือว่าแม้ว่า:

  1. เซิร์ฟเวอร์ DHCP กำลังส่งชื่อโฮสต์ (โดยการเพิ่ม

    option host name 'client1' 
    

    ใน dhcpd.conf) และฉันตรวจสอบจริงโดยการจับภาพและวิเคราะห์เนื้อหาของข้อเสนอ DHCP ด้วย wireshark

  2. ไคลเอ็นต์ DHCP ต้องการชื่อโฮสต์จากเซิร์ฟเวอร์ DHCP (โดยการเพิ่ม

    request host-name 
    

    ใน dhclient.conf)

ลูกค้าไม่ได้รับชื่อโฮสต์ใหม่ (ตรวจสอบได้ง่ายโดยพิมพ์

hostname

ใน terminal และรับชื่อโฮสต์เก่าหรือไม่มีชื่อโฮสต์หากฉันลบเนื้อหา / ไฟล์) ดังนั้นโซลูชันที่เสนอโดย d_inevitable จึงเป็นการคัดลอกสตริงว่างเท่านั้น

เพื่อแก้ปัญหานั้นฉันใช้วิธีแก้ปัญหาที่ไม่เหมาะสมโดยทั่วไปไม่ควรทำตามเว้นแต่คุณจะหมดหวังที่จะทำงานให้เหมือนที่เคยเป็นมา

ก่อนอื่นเปิดด้วยความสามารถในการแก้ไขสคริปต์ควบคุมไคลเอ็นต์ DHCP:

sudo vi /sbin/dhclient-script

ที่นั่นคุณจะต้องค้นหาฟังก์ชั่น

set_hostname()

เพียงใช้การค้นหาและมันควรจะเกิดขึ้น ตอนนี้อย่างน้อยในคอมพิวเตอร์ของฉันฟังก์ชั่นนี้มีสามเงื่อนไข if-then-else ถูกห่อหุ้มซึ่งกันและกัน:

# set ชื่อโฮสต์ set_hostname () {local 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 }

ตอนนี้สิ่งที่คุณต้องการคือการกำหนดชื่อโฮสต์ใหม่ให้กับโฮสต์ของคุณไม่ว่าจะเกิดอะไรขึ้นก็ตาม ดังนั้นคุณต้องการแสดงความคิดเห็นทั้งสอง encapsulated if-then-else ผลลัพธ์ควรมีลักษณะดังนี้:

# set ชื่อโฮสต์ set_hostname () {local 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

คำตอบของ Oli นั้นผิดพลาดอย่างชัดเจน ("คุณไม่ได้รับชื่อโฮสต์ของคุณจากเซิร์ฟเวอร์ DHCP") ดังที่เห็นได้จากคำตอบอื่น ๆ ที่นี่และจากประสบการณ์ล่าสุดของฉันในระบบ RHEL7 ระบบดังกล่าวได้รับชื่อโฮสต์จากเซิร์ฟเวอร์ DHCP

และแน่นอนว่ามีหลายสิ่งในไฟล์กำหนดค่า DHCP ที่ควรจะเกิดขึ้น ตัวอย่างเช่น:

host host4 {   # verified                                                                                                                                                                                                                   
  hardware ethernet  41:88:22:11:33:22;
  fixed-address 192.168.0.4;                                                                                                                                                                                 
  option host-name "host4";
}

ควรจะบอกโฮสต์ว่าชื่อของเขาคือ host4

ตามที่ปรากฏออกมา dhclient ของ isc ไม่ปรากฏตัวเพื่อสนับสนุนสิ่งนี้!

อย่างไรก็ตาม dhcpcd5 ทำออกมาจากกล่อง หยุด dhclient ติดตั้ง dhcpcd5, รัน dhcpcd, ต่ออายุสัญญาเช่าของคุณและคนโง่, ชื่อโฮสต์ของคุณบนไคลเอนต์ DHCP ของคุณถูกตั้งค่าเป็นชื่อที่ส่งจากเซิร์ฟเวอร์ DHCP ไม่มีdhclient-exit-hooks.dสคริปต์ไม่มีแฮ็คrc.localคไม่มีอะไร

ในฐานะผู้ใช้ปลายทางฉันได้ใช้เวลามากมายในการพยายามทำให้เรื่องนี้ทำงานโดยใช้ dhclient ของ ISC ไม่มีความสุขอย่างแน่นอนแม้เมื่อเซิร์ฟเวอร์ส่งชื่อโฮสต์

ทางออกแรกของปัญหาคือการเขียนโค้ดที่น่ารักrc.localเพื่อตรวจจับเมื่อเครือข่ายเกิดขึ้นและบังคับให้ค้นหา (ในกรณีของฉัน) /etc/hostsเพื่อให้ได้ชื่อโฮสต์แล้วเรียกใช้hostnameด้วยชื่อโฮสต์นั้น ใช้งานได้ แต่จนกว่าเครือข่ายจะปรากฏชื่อโฮสต์ของคุณอาจผิด (เมื่อทำการปรับใช้โฮสต์ครั้งแรกฉันจะลบ/etc/hostnameดังนั้นชื่อโฮสต์จะเป็นlocalhostจนกว่าฉันจะสามารถเรียกใช้/etc/init.d/hostname.sh startเมื่อเครือข่ายมาถึง - ดังนั้นเมื่อได้รับชื่อใหม่คุณต้องบูต สองครั้ง - หนึ่งครั้งเพื่อรับชื่อโฮสต์ของคุณและอีกครั้งที่จะมีชื่อนั้นเมื่อทุกอย่างเริ่มต้นขึ้น ... )


1

คุณไม่ได้รับชื่อโฮสต์จากเซิร์ฟเวอร์ DHCP

คุณสามารถส่งชื่อโฮสต์ของคุณไปยังเซิร์ฟเวอร์ซึ่งอาจเปลี่ยน IP ที่คุณได้รับมอบหมาย คุณสามารถเปลี่ยนสิ่งที่ชื่อจะถูกส่งโดยการแก้ไขการเชื่อมต่อเครือข่าย Manager ของคุณ (เขตที่เรียกว่าไคลเอ็นต์ DHCP ID) หรือคุณสามารถแก้ไข (เป็น /etc/dhcp/dhclient.confroot) มองหาบรรทัดที่เขียนว่า:

send host-name "<hostname>";

... และเปลี่ยน<hostname>เป็นสิ่งที่คุณต้องการ


โดยค่าเริ่มต้นอูบุนตูจะได้รับการตั้งค่า DNS จากเราเตอร์ (ถ้าส่ง) แต่ฉันสงสัยว่าคุณกำลังพูดถึง l ocal DNS / mDNSที่คุณสามารถเข้าถึงคอมพิวเตอร์เครื่องอื่นด้วยชื่อโฮสต์ของพวกเขา สิ่งนี้เรียกว่า Ahavi หรือ Zeroconf ใน Ubuntu และติดตั้งตามค่าเริ่มต้น

คุณควรจะสามารถเข้าถึงคอมพิวเตอร์ของคุณโดย <hostname>.local


ฉันมีเซิร์ฟเวอร์ dns และ dhcp (windows 2008) ในเครือข่ายของฉัน Ant จะกำหนดชื่อโฮสต์และชื่อ DNS ให้กับแต่ละ ip แต่ ubuntu ไม่ได้อัปเดตชื่อโฮสต์และชื่อ DNS ฉันควรจะสามารถที่จะเห็นนี้ชื่อโฮสต์ได้รับมอบหมายจากการพิมพ์และโดเมนโดยการพิมพ์hostname hostname -dดังนั้น fqdn ควรเป็นชื่อโฮสต์
โดเมน

AFAIR หากไคลเอ็นต์ไม่ได้เข้าร่วมกับโดเมน Windows เซิร์ฟเวอร์ Windows DHCP จะไม่อัปเดตรายการ Windows DNS แบบไดนามิก ฉันไม่แน่ใจจริงๆ ... ขึ้นอยู่กับการกำหนดค่า Windows DHCP / DNS
oddfellow

โดยค่าเริ่มต้น 12.04 มีบรรทัดนี้ "send host-name = gethostname ();" และคุณสามารถเห็นค่าดังกล่าวได้โดยพิมพ์ "ชื่อโฮสต์" บนบรรทัดคำสั่ง ตามค่าเริ่มต้นสิ่งนี้จะไม่มีผลกระทบใด ๆ กับเครือข่าย windows ตามคำถามเดิม
Moz

แม้ว่า zeroconf จะถูกติดตั้งตามค่าเริ่มต้น แต่ก็ไม่น่าเชื่อถืออย่างน่ากลัว ฉันประหลาดใจอย่างตรงไปตรงมาเมื่อใช้งานการส่งชื่อโฮสต์หรือชื่อโฮสต์ host.local ไม่ค่อยประสบความสำเร็จแม้ว่าจะไม่มีการเปลี่ยนแปลงใด ๆ ในเครือข่ายของฉันในหลายเดือน
Cerin

1
สิ่งนี้ไม่เป็นความจริงเลย ขณะที่คุณสามารถส่งชื่อโฮสต์ของคุณไปยังเซิร์ฟเวอร์ DHCP ด้วยsend host-name "example.com";เพื่อที่จะได้อยู่ที่เฉพาะเจาะจง IP คุณสามารถก็เช่นกันขอให้request host-name;เป็นหนึ่งเดียวกับ
Dmitry Grigoryev

1

หากพบว่าอาจเป็นข้อผิดพลาดของสคริปต์ dhcpclient http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html

ลองล้าง $ old_host_name เมื่อต่ออายุ ip

echo unset old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname

นอกจากนี้สแตติก / etc / hostname ก็ดูเหมือนว่ามี prority มากกว่าคำตอบ dhcp ดังนั้นปล่อยว่างไว้

> / etc / hostname

ทดสอบบน Ubuntu 14.04 และเซิร์ฟเวอร์ dnsmasq


1

โปรดทราบว่าเมื่อใช้Ubuntu 18.04สคริปต์ tie-in ไม่จำเป็นอีกต่อไป หากชื่อโฮสต์ของการติดตั้งถูกตั้งค่าเป็นlocalhostใน/etc/hostnameไคลเอนต์ DHCP จะตั้งชื่อโฮสต์โดยอัตโนมัติเมื่อเริ่มต้นโดยใช้ชื่อที่ออกโดย DHCP หากมี เมื่อเรียกใช้hostnamectlมันจะแสดงรายการlocalhostเป็นชื่อโฮสต์ถาวรและปัญหา DHCP ใดก็ตามที่เป็นชื่อโฮสต์ชั่วคราว

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

0

คำตอบขึ้นอยู่กับว่าคุณใช้สัญญาเช่าแบบคงที่หรือไม่บนเซิร์ฟเวอร์ DHCP ของคุณ หากคุณไม่จำเป็นต้องรับชื่อโฮสต์จาก DNS คุณสามารถเปลี่ยนบรรทัดนี้ในโซลูชันของ d_inevitable

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

ถึง

hostname=${new_host_name}

แต่สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติหากชื่อโฮสต์ของคุณถูกตั้งค่าเป็น localhost.localdomain แต่เดิมคุณไม่ต้องเขียนสคริปต์ อย่างไรก็ตามหากคุณต้องการตั้งชื่อโฮสต์เป็น FQDN คุณจะต้องเปลี่ยนสคริปต์ของ d_inevitable เป็น

hostname=${new_host_name}.${new_domain_name}

ทั้งหมดนี้ใช้ได้เฉพาะในกรณีที่คุณใช้สัญญาเช่าแบบคงที่


0

ไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็น แต่ฉันต้องการ piggy-back กับคำตอบก่อนหน้านี้เพราะมันเกือบจะแก้ไขปัญหาให้ฉันได้โดยใช้ตะขอ dhclient

ฉันพบว่าการใช้เซิร์ฟเวอร์ ISC DHCP มาตรฐานด้วยเหตุผลบางอย่าง hook ดังกล่าวจะแสดงชื่อโฮสต์ด้วย '.' อักขระระยะเวลาในตอนท้ายของชื่อโฮสต์ด้วยเหตุผลบางอย่าง

ดังนั้นในคำตอบก่อนหน้านี้คุณอาจต้อง "ตัดออก" ช่วงเวลาที่ไม่เกี่ยวข้องกับ sed:

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

จะกลายเป็น:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.