DHCP 서버에서 호스트 이름을 얻는 방법


답변:


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

교체 eth0wlan0당신이 호스트 이름을 가져 오려는 인터페이스의 이름. 대부분의 경우 eth0wlan0동일하게 유지해야한다.

읽을 수 있는지 확인하십시오 ...

chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname

그게 다야. 다음 dhcp 응답에서 호스트 이름이 자동으로 업데이트됩니다.


이 스크립트는 실제로 host명령을 사용하여 DNS 쿼리를 사용 하여 할당 된 IP 주소와 관련된 호스트 이름을 추출합니다. DHCP 서버는 실제로 호스트 이름 옵션 (옵션 12)을 명시 적으로 설정할 수 있습니다.이 옵션은 IP의 DNS 쿼리에서 얻은 호스트 이름과 다를 수 있습니다 (IP에 대한 PTR 레코드가 DNS에 없으면 실패 할 수도 있음) )
Ale


3

d_inevitable의 대답은 내 문제를 거의 해결했지만 완전히 해결하지 못했습니다. 문제는 다음과 같습니다.

  1. DHCP 서버가 호스트 이름을 전송했습니다 (

    option host name 'client1' 
    

    dhcpd.conf)에서 wireshark로 DHCP 오퍼의 내용을 캡처하고 분석하여 실제로 확인했습니다.

  2. DHCP 클라이언트는 DHCP 서버에서 호스트 이름을 기대하고있었습니다 (추가하여

    request host-name 
    

    dhclient.conf에서)

클라이언트가 새 호스트 이름을 얻지 못했습니다 (쉽게 입력하여 확인)

hostname

터미널에서 이전 호스트 이름을 얻거나 내용 / 파일을 삭제 한 경우 호스트 이름이 없습니다). 결과적으로 d_inevitable이 제안한 솔루션은 빈 문자열 만 복사하는 것입니다.

이를 해결하기 위해 나는 crud 솔루션을 적용했다.

먼저 DHCP 클라이언트 제어 스크립트를 편집 기능으로 엽니 다.

sudo vi /sbin/dhclient-script

거기서 기능을 찾아야합니다.

set_hostname()

검색을 사용하면 바로 올 수 있습니다. 이제 적어도 내 컴퓨터 에서이 기능에는 세 가지 if-then-else 조건이 있으며 서로 캡슐화되어 있습니다.

# 호스트 이름 설정 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 }

이제 필요한 것은 새 호스트 이름을 호스트에 강제로 할당하는 것입니다. 따라서 캡슐화 된 두 if-then-else를 주석 처리하고 싶습니다. 결과는 다음과 같아야합니다.

# 호스트 이름 설정 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의 답변은 여기에 다른 답변과 RHEL7 시스템에서의 최근 경험에 의해 입증 된 것처럼 명백히 거짓입니다 ( "DHCP 서버에서 호스트 이름을 얻지 못했습니다"). 상기 시스템은 DHCP 서버로부터 호스트 이름을 얻었다.

실제로 DHCP 구성 파일에는이를 수행해야하는 사항이 있습니다. 예를 들면 다음과 같습니다.

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

해당 호스트에게 그의 이름이 host4라고 알려야합니다.

결과적으로 isc의 dhclient는 이것을 지원하지 않습니다!

그러나 dhcpcd5는 기본적으로 제공됩니다. dhclient를 중지하고, dhcpcd5를 설치하고, dhcpcd를 실행하고, 임대를 갱신하고, 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

DHCP 서버에서 호스트 이름을 얻지 못했습니다.

당신은 할 수 보내 당신이 지정하고있는 IP를 변경할 수 있습니다 서버에 호스트 이름을. Network Manager 연결을 편집하여 (필드는 DHCP 클라이언트 ID라고 함) 편집하거나 (루트로) 편집 할 수 있습니다 /etc/dhcp/dhclient.conf. 다음과 같은 줄을 찾으십시오.

send host-name "<hostname>";

... 그리고 <hostname>당신이 원하는대로 변경하십시오 .


기본적으로 우분투는 라우터에서 DNS 설정을 가져옵니다 (전송하는 경우)하지만 호스트 이름으로 다른 컴퓨터에 액세스 할 수있는 10 DNS / mDNS 에 대해 이야기하고 있다고 생각합니다 . 이것을 우분투에서 Ahavi 또는 Zeroconf라고하며 기본적으로 설치됩니다.

다음 방법으로 컴퓨터에 액세스 할 수 있어야합니다 <hostname>.local


네트워크에 DNS 및 DHCP (Windows 2008) 서버가 있습니다. Ant는 각 IP에 호스트 이름과 DNS 이름을 할당하지만 우분투는 호스트 이름과 DNS 이름을 업데이트하지 않습니다. 을 입력 hostname하고 도메인을 입력 하여 할당 된이 호스트 이름을 볼 수 있어야합니다 hostname -d. fqdn은 hostname.domain이어야합니다
Oguz Bilgic

AFAIR 클라이언트가 Windows 도메인에 가입되어 있지 않으면 Windows DHCP 서버는 Windows DNS 항목을 동적으로 업데이트하지 않습니다. 그래도 확실하지 않습니다 ... Windows DHCP / DNS 구성에 따라 다릅니다.
oddfellow

기본적으로 12.04에는 "send host-name = gethostname ();"줄이 있습니다. 명령 행에 "hostname"을 입력하면 해당 값을 볼 수 있습니다. 기본적으로 이것은 Windows 네트워크에 영향을 미치지 않습니다. 원래 질문에 따라.
Móż

zeroconf가 기본적으로 설치되어 있지만 믿기지 않습니다. 호스트 이름 또는 hostname.local을 ping하면 몇 달 안에 네트워크에서 아무런 변화가 없어도 거의 성공하지 못하기 때문에 솔직히 놀랍습니다.
Cerin

1
이것은 사실이 아닙니다. 당신은 할 수 있지만 보낼 수 와 DHCP 서버에 호스트 이름을 send host-name "example.com";특정 IP 주소를 얻기 위해, 당신은 단지뿐만 아니라 수 있습니다 요청 과 하나 request host-name;.
Dmitry Grigoryev


1

사용할 때주의하는 것이 우분투 18.04를 타이의 스크립트는 더 이상 필요하지 않습니다. DHCP 클라이언트 localhost에서 설치 호스트 이름을 /etc/hostname설정하면 시작할 때 DHCP에서 발행 한 이름을 사용하여 호스트 이름을 자동으로 설정합니다 (있는 경우). 실행 하면 영구 호스트 이름과 임시 호스트 이름으로 발생하는 DHCP hostnamectl가 나열 localhost됩니다.

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

의견이 충분하지는 않지만 dhclient hook을 사용하여 문제를 거의 해결했기 때문에 이전 답변을 피기 백하고 싶습니다.

어떤 이유로 표준 ISC DHCP 서버를 사용하면 위에서 언급 한 후크가 호스트 이름을 '.'으로 출력한다는 것을 알았습니다. 어떤 이유로 호스트 이름의 끝에 마침표 문자가 있습니다.

따라서 이전 답변에서 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.