Tôi muốn Ubuntu lấy tên máy chủ và tên DNS từ máy khách DHCP . Cài đặt mặc định của Ubuntu 11.10 (Oneiric Ocelot) không làm được điều đó.
Câu hỏi tương tự đã được hỏi và chưa được giải quyết trên Diễn đàn Ubuntu .
Tôi muốn Ubuntu lấy tên máy chủ và tên DNS từ máy khách DHCP . Cài đặt mặc định của Ubuntu 11.10 (Oneiric Ocelot) không làm được điều đó.
Câu hỏi tương tự đã được hỏi và chưa được giải quyết trên Diễn đàn Ubuntu .
Câu trả lời:
Có một cách để làm điều đó với một đoạn script nhỏ cho hook dhcp như được mô tả ở đây .
Tạo một tệp mới:
sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname
và dán đoạn mã sau:
#!/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
Thay thế eth0
và wlan0
bằng tên của các giao diện mà bạn muốn lấy tên máy chủ. Trong hầu hết các trường hợp eth0
và wlan0
nên giữ nguyên.
Hãy chắc chắn rằng nó có thể đọc được ...
chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname
Đó là tất cả. Trong phản hồi dhcp tiếp theo, tên máy chủ của bạn sẽ tự động cập nhật.
Bạn có thể lấy tên máy chủ của mình từ máy chủ DHCP - đó là một phần của đặc tả DHCP.
https://tools.ietf.org/html/rfc1533#section-3,14
"Tùy chọn này chỉ định tên của khách hàng"
Câu trả lời của d_inevitable gần như đã giải quyết vấn đề của tôi, nhưng không hoàn toàn. Vấn đề là mặc dù:
Máy chủ DHCP đã gửi tên máy chủ (bằng cách thêm
option host name 'client1'
trong dhcpd.conf) và tôi thực sự đã xác minh nó bằng cách nắm bắt và phân tích nội dung của đề nghị DHCP với wireshark
Máy khách DHCP đang mong đợi tên máy chủ từ máy chủ DHCP (bằng cách thêm
request host-name
trong dhclient.conf)
Máy khách không nhận được tên máy chủ mới (dễ dàng xác minh bằng cách nhập
hostname
trong thiết bị đầu cuối và nhận tên máy chủ cũ hoặc không có tên máy chủ nếu tôi đã xóa nội dung / tệp). Kết quả là, giải pháp được đề xuất bởi d_inevitable chỉ là sao chép một chuỗi rỗng.
Để giải quyết điều đó, tôi đã áp dụng một giải pháp thô sơ, thường không nên tuân theo trừ khi bạn tuyệt vọng để làm cho nó hoạt động, giống như tôi.
Đầu tiên, mở với khả năng chỉnh sửa tập lệnh điều khiển máy khách DHCP:
sudo vi /sbin/dhclient-script
Ở đó, bạn sẽ phải xác định vị trí chức năng
set_hostname()
Chỉ cần sử dụng tìm kiếm và nó sẽ đi lên. Bây giờ, ít nhất trên máy tính của tôi, chức năng này có ba điều kiện if-then-other, được gói gọn với nhau:
# đặt tên máy chủ 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 }
Bây giờ, những gì bạn cần là buộc gán tên máy chủ mới cho máy chủ của bạn, không có vấn đề gì. Vì vậy, bạn muốn bình luận về hai đóng gói if-then-other. Kết quả sẽ trông giống như:
# đặt tên máy chủ 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 }
Bây giờ d_inevitable's hoặc điều này sẽ hoạt động như mong đợi. Hy vọng rằng sẽ giúp nếu bạn đang ở trong một sự thất vọng tuyệt vọng tương tự như tôi.
Câu trả lời của Oli là sai lầm ("Bạn không nhận được tên máy chủ của mình từ máy chủ DHCP"), bằng chứng là các câu trả lời khác ở đây, và cũng bởi kinh nghiệm gần đây của tôi trên hệ thống RHEL7. Hệ thống cho biết có tên máy chủ từ máy chủ DHCP.
Và, thực sự, có những thứ trong các tệp cấu hình DHCP được cho là sẽ làm cho nó xảy ra. Ví dụ:
host host4 { # verified
hardware ethernet 41:88:22:11:33:22;
fixed-address 192.168.0.4;
option host-name "host4";
}
Có nghĩa vụ phải nói với chủ nhà rằng tên của anh ta là host4.
Hóa ra, isc's dhclient KHÔNG NÊN DÀNH CHO HPORT TRỢ NÀY!
Tuy nhiên, dhcpcd5 không, ra khỏi hộp. Dừng dhclient, cài đặt dhcpcd5, chạy dhcpcd, gia hạn hợp đồng thuê và poof, tên máy chủ của bạn trên máy khách DHCP của bạn được đặt thành tên được gửi từ máy chủ DHCP. Không có dhclient-exit-hooks.d
kịch bản, không có hack rc.local
, không có gì.
Như một lưu ý cuối cùng, tôi đã dành rất nhiều thời gian để cố gắng làm cho nó hoạt động bằng cách sử dụng thành thạo của ISC. Hoàn toàn không có niềm vui, ngay cả khi máy chủ gửi tên máy chủ.
Giải pháp ban đầu của tôi cho vấn đề là viết một số mã dễ thương rc.local
để phát hiện khi mạng xuất hiện và buộc tìm kiếm (trong trường hợp của tôi) /etc/hosts
để lấy tên máy chủ và sau đó chạy hostname
với tên máy chủ đó. Nó hoạt động, nhưng cho đến khi mạng xuất hiện tên máy chủ của bạn có thể sai (khi lần đầu tiên triển khai máy chủ, tôi xóa /etc/hostname
, vì vậy tên máy chủ là localhost
cho đến khi tôi có thể chạy /etc/init.d/hostname.sh start
khi mạng xuất hiện - vì vậy khi lần đầu tiên nhận được tên mới, bạn cần khởi động hai lần - một lần để có được tên máy chủ của bạn và một lần để có sẵn tên đó khi mọi thứ bắt đầu ...).
Bạn không nhận được tên máy chủ của mình từ máy chủ DHCP.
Bạn có thể gửi tên máy chủ của mình đến máy chủ, có thể thay đổi IP bạn được chỉ định. Bạn có thể thay đổi tên được gửi bằng cách chỉnh sửa kết nối Trình quản lý mạng của mình (trường được gọi là DHCP Client ID) hoặc bạn có thể chỉnh sửa (với quyền root) /etc/dhcp/dhclient.conf
. Tìm dòng có nội dung:
send host-name "<hostname>";
... và thay đổi <hostname>
thành bất cứ điều gì bạn thích.
Theo mặc định, Ubuntu sẽ nhận các cài đặt DNS của nó từ bộ định tuyến (nếu nó gửi chúng) nhưng tôi nghi ngờ bạn đang nói về DNS / mDNS thứ tám nơi bạn có thể truy cập các máy tính khác bằng tên máy chủ của chúng. Đây được gọi là Ahavi hoặc Zeroconf trong Ubuntu và được cài đặt theo mặc định.
Bạn sẽ có thể truy cập máy tính của mình bằng cách <hostname>.local
hostname
và tên miền bằng cách nhập hostname -d
. vì vậy fqdn nên là hostname.domain
send host-name "example.com";
để có được địa chỉ IP cụ thể, bạn cũng có thể yêu cầu một địa chỉ request host-name;
.
Nếu tìm thấy có thể là một lỗi script dhcpclient. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
Cố gắng làm sạch $ old_host_name khi gia hạn ip
echo unset old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname
Ngoài ra tĩnh / etc / tên máy chủ dường như có tính ưu việt đối với câu trả lời dhcp, vì vậy hãy để trống
> / etc / tên máy chủ
Đã thử nghiệm trên máy chủ Ubuntu 14.04 và dnsmasq.
Lưu ý rằng khi sử dụng Ubuntu 18.04, các tập lệnh liên kết không còn cần thiết nữa. Nếu tên máy chủ của cài đặt được đặt thành localhost
trong /etc/hostname
máy khách DHCP sẽ tự động đặt tên máy chủ khi khởi động bằng tên do DHCP cấp, nếu có. Khi chạy, hostnamectl
nó sẽ liệt kê localhost
là tên máy chủ vĩnh viễn và bất kỳ DHCP nào phát hành dưới dạng tên máy chủ tạm thời.
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
Câu trả lời phụ thuộc vào việc bạn có sử dụng hợp đồng thuê tĩnh trên máy chủ DHCP hay không. Nếu là bạn, không cần thiết phải lấy tên máy chủ từ DNS. Bạn có thể thay đổi dòng này trong giải pháp của d_inevitable's
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
đến
hostname=${new_host_name}
Nhưng điều này sẽ tự động xảy ra nếu tên máy chủ của bạn ban đầu được đặt thành localhost.localdomain, vì vậy bạn không phải viết một tập lệnh. Tuy nhiên, nếu bạn muốn đặt tên máy chủ thành FQDN, bạn sẽ cần thay đổi tập lệnh của d_inevitable thành
hostname=${new_host_name}.${new_domain_name}
Một lần nữa, tất cả điều này chỉ hoạt động nếu bạn đang sử dụng cho thuê tĩnh.
Không có đủ danh tiếng để bình luận, nhưng tôi muốn cõng câu trả lời trước vì nó gần như đã giải quyết được vấn đề cho tôi bằng cách sử dụng một cái móc thông minh.
Tôi đã thấy rằng bằng cách sử dụng Máy chủ DHCP ISC tiêu chuẩn vì một số lý do, hook đã nói ở trên xuất ra một tên máy chủ có dấu '.' ký tự dấu chấm ở cuối tên máy chủ vì một số lý do.
Vì vậy, trong câu trả lời trước, bạn có thể cần "cắt bỏ" khoảng thời gian không liên quan bằng một chiếc sed:
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
Sẽ trở thành:
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
host
lệnh) để trích xuất tên máy chủ được liên kết với địa chỉ IP được chỉ định. Các máy chủ DHCP thực sự có thể đặt tùy chọn tên máy chủ (tùy chọn 12), có khả năng khác với tên máy chủ bạn nhận được từ truy vấn DNS trên IP (điều này có khả năng cũng có thể thất bại, nếu không có bản ghi PTR cho IP tồn tại trên DNS )