Cách lấy tên máy chủ từ máy chủ DHCP


Câu trả lời:


6

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ế eth0wlan0bằ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 eth0wlan0nê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.


tập lệnh này thực sự sử dụng truy vấn DNS (sử dụng hostlệ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 )
Ale


3

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ù:

  1. 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

  2. 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.


3

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.dkị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 hostnamevớ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à localhostcho đến khi tôi có thể chạy /etc/init.d/hostname.sh startkhi 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 ...).


1

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


Tôi có máy chủ dns và dhcp (windows 2008) trên mạng của mình. Ant nó gán tên máy chủ và tên dns cho mỗi ip, nhưng ubfox không cập nhật tên máy chủ và tên dns. Tôi có thể thấy tên máy chủ được gán này bằng cách nhập hostnamevà tên miền bằng cách nhập hostname -d. vì vậy fqdn nên là hostname.domain
Oguz Bilgic

AFAIR nếu máy khách không được kết nối với miền Windows, máy chủ Windows DHCP sẽ không tự động cập nhật các mục DNS của Windows. Tôi không thực sự chắc chắn mặc dù ... phụ thuộc vào cấu hình Windows DHCP / DNS
oddfellow 17/212

Theo mặc định, 12.04 có dòng này "send host-name = gethostname ();" và bạn có thể thấy giá trị đó bằng cách nhập "tên máy chủ" trên dòng lệnh. Theo mặc định, điều này sẽ không có bất kỳ ảnh hưởng nào đến mạng windows. Theo câu hỏi ban đầu.
Móż

Mặc dù zeroconf được cài đặt theo mặc định, nhưng nó không đáng tin cậy khủng khiếp. Tôi thực sự ngạc nhiên khi nó hoạt động, vì ping tên máy chủ hoặc tên máy chủ. Tiêu điểm hiếm khi mang lại thành công mặc dù không có gì thay đổi trên mạng của tôi trong nhiều tháng.
Cerin

1
Điều này hoàn toàn không đúng. Mặc dù bạn có thể gửi tên máy chủ của mình đến máy chủ DHCP 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;.
Dmitry Grigoryev

1

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.


1

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 localhosttrong /etc/hostnamemá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, hostnamectlnó sẽ liệt kê localhostlà 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

0

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.


0

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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.