ฉันต้องการ Ubuntu เพื่อรับชื่อโฮสต์และชื่อ DNS จากไคลเอนต์DHCP การติดตั้งเริ่มต้นของUbuntu 11.10 (Oneiric Ocelot) ไม่ทำเช่นนั้น
คำถามเดียวกันถูกถามและไม่แก้ในอูบุนตูฟอรั่ม
ฉันต้องการ Ubuntu เพื่อรับชื่อโฮสต์และชื่อ DNS จากไคลเอนต์DHCP การติดตั้งเริ่มต้นของ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 ครั้งต่อไปชื่อโฮสต์ของคุณจะอัปเดตโดยอัตโนมัติ
คุณสามารถรับชื่อโฮสต์จากเซิร์ฟเวอร์ DHCP ของคุณซึ่งเป็นส่วนหนึ่งของข้อกำหนด DHCP
https://tools.ietf.org/html/rfc1533#section-3.14
"ตัวเลือกนี้ระบุชื่อลูกค้า"
คำตอบของ d_inevitable เกือบแก้ปัญหาของฉันได้ แต่ไม่สมบูรณ์ ปัญหาคือว่าแม้ว่า:
เซิร์ฟเวอร์ DHCP กำลังส่งชื่อโฮสต์ (โดยการเพิ่ม
option host name 'client1'
ใน dhcpd.conf) และฉันตรวจสอบจริงโดยการจับภาพและวิเคราะห์เนื้อหาของข้อเสนอ DHCP ด้วย wireshark
ไคลเอ็นต์ 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 หรือนี้ควรจะทำงานที่คาดว่าจะเป็น หวังว่าจะช่วยถ้าคุณอยู่ในความหงุดหงิดสิ้นหวังคล้ายกับที่ฉันเป็น
คำตอบของ 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
เมื่อเครือข่ายมาถึง - ดังนั้นเมื่อได้รับชื่อใหม่คุณต้องบูต สองครั้ง - หนึ่งครั้งเพื่อรับชื่อโฮสต์ของคุณและอีกครั้งที่จะมีชื่อนั้นเมื่อทุกอย่างเริ่มต้นขึ้น ... )
คุณไม่ได้รับชื่อโฮสต์จากเซิร์ฟเวอร์ DHCP
คุณสามารถส่งชื่อโฮสต์ของคุณไปยังเซิร์ฟเวอร์ซึ่งอาจเปลี่ยน IP ที่คุณได้รับมอบหมาย คุณสามารถเปลี่ยนสิ่งที่ชื่อจะถูกส่งโดยการแก้ไขการเชื่อมต่อเครือข่าย Manager ของคุณ (เขตที่เรียกว่าไคลเอ็นต์ DHCP ID) หรือคุณสามารถแก้ไข (เป็น /etc/dhcp/dhclient.conf
root) มองหาบรรทัดที่เขียนว่า:
send host-name "<hostname>";
... และเปลี่ยน<hostname>
เป็นสิ่งที่คุณต้องการ
โดยค่าเริ่มต้นอูบุนตูจะได้รับการตั้งค่า DNS จากเราเตอร์ (ถ้าส่ง) แต่ฉันสงสัยว่าคุณกำลังพูดถึง l ocal DNS / mDNSที่คุณสามารถเข้าถึงคอมพิวเตอร์เครื่องอื่นด้วยชื่อโฮสต์ของพวกเขา สิ่งนี้เรียกว่า Ahavi หรือ Zeroconf ใน Ubuntu และติดตั้งตามค่าเริ่มต้น
คุณควรจะสามารถเข้าถึงคอมพิวเตอร์ของคุณโดย <hostname>.local
hostname
hostname -d
ดังนั้น fqdn ควรเป็นชื่อโฮสต์
send host-name "example.com";
เพื่อที่จะได้อยู่ที่เฉพาะเจาะจง IP คุณสามารถก็เช่นกันขอให้request host-name;
เป็นหนึ่งเดียวกับ
หากพบว่าอาจเป็นข้อผิดพลาดของสคริปต์ 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
โปรดทราบว่าเมื่อใช้Ubuntu 18.04สคริปต์ tie-in ไม่จำเป็นอีกต่อไป หากชื่อโฮสต์ของการติดตั้งถูกตั้งค่าเป็นlocalhost
ใน/etc/hostname
ไคลเอนต์ DHCP จะตั้งชื่อโฮสต์โดยอัตโนมัติเมื่อเริ่มต้นโดยใช้ชื่อที่ออกโดย DHCP หากมี เมื่อเรียกใช้hostnamectl
มันจะแสดงรายการlocalhost
เป็นชื่อโฮสต์ถาวรและปัญหา DHCP ใดก็ตามที่เป็นชื่อโฮสต์ชั่วคราว
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
คำตอบขึ้นอยู่กับว่าคุณใช้สัญญาเช่าแบบคงที่หรือไม่บนเซิร์ฟเวอร์ 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}
ทั้งหมดนี้ใช้ได้เฉพาะในกรณีที่คุณใช้สัญญาเช่าแบบคงที่
ไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็น แต่ฉันต้องการ 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")
host
คำสั่ง) เพื่อแยกชื่อโฮสต์ที่เกี่ยวข้องกับที่อยู่ IP ที่กำหนด เซิร์ฟเวอร์ DHCP สามารถตั้งค่าตัวเลือกชื่อโฮสต์ (ตัวเลือก 12) ได้อย่างชัดเจนซึ่งอาจแตกต่างจากชื่อโฮสต์ที่คุณได้รับจากการสืบค้น DNS บน IP (ซึ่งอาจเกิดความล้มเหลวได้หากไม่มีเรคคอร์ด PTR สำหรับ IP อยู่บน DNS )