Ubuntu가 DHCP 클라이언트 에서 호스트 이름과 DNS 이름을 가져 오기를 원합니다 . Ubuntu 11.10 (Oneiric Ocelot) 의 기본 설치는 그렇게하지 않습니다.
Ubuntu가 DHCP 클라이언트 에서 호스트 이름과 DNS 이름을 가져 오기를 원합니다 . 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)에서 wireshark로 DHCP 오퍼의 내용을 캡처하고 분석하여 실제로 확인했습니다.
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 나 이 예상대로 작동합니다. 당신이 저와 비슷한 절망에 빠지면 도움이 되길 바랍니다.
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
따라서 처음 새 이름을 받으면 부팅해야합니다. 두 번-한 번 호스트 이름을 얻으려면 한 번 모든 것이 시작될 때 해당 이름을 사용할 수있게하십시오 ...).
DHCP 서버에서 호스트 이름을 얻지 못했습니다.
당신은 할 수 보내 당신이 지정하고있는 IP를 변경할 수 있습니다 서버에 호스트 이름을. Network Manager 연결을 편집하여 (필드는 DHCP 클라이언트 ID라고 함) 편집하거나 (루트로) 편집 할 수 있습니다 /etc/dhcp/dhclient.conf
. 다음과 같은 줄을 찾으십시오.
send host-name "<hostname>";
... 그리고 <hostname>
당신이 원하는대로 변경하십시오 .
기본적으로 우분투는 라우터에서 DNS 설정을 가져옵니다 (전송하는 경우)하지만 호스트 이름으로 다른 컴퓨터에 액세스 할 수있는 10 DNS / mDNS 에 대해 이야기하고 있다고 생각합니다 . 이것을 우분투에서 Ahavi 또는 Zeroconf라고하며 기본적으로 설치됩니다.
다음 방법으로 컴퓨터에 액세스 할 수 있어야합니다 <hostname>.local
hostname
하고 도메인을 입력 하여 할당 된이 호스트 이름을 볼 수 있어야합니다 hostname -d
. fqdn은 hostname.domain이어야합니다
send host-name "example.com";
특정 IP 주소를 얻기 위해, 당신은 단지뿐만 아니라 수 있습니다 요청 과 하나 request host-name;
.
발견되면 dhcpclient 스크립트 버그 일 수 있습니다. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
IP 갱신시 $ old_host_name을 정리하십시오
echo unset old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname
또한 정적 / etc / hostname은 dhcp 응답보다 비싸기 때문에 비워 두십시오.
> / etc / hostname
우분투 14.04 및 dnsmasq 서버에서 테스트되었습니다.
사용할 때주의하는 것이 우분투 18.04를 타이의 스크립트는 더 이상 필요하지 않습니다. DHCP 클라이언트 localhost
에서 설치 호스트 이름을 /etc/hostname
설정하면 시작할 때 DHCP에서 발행 한 이름을 사용하여 호스트 이름을 자동으로 설정합니다 (있는 경우). 실행 하면 영구 호스트 이름과 임시 호스트 이름으로 발생하는 DHCP hostnamectl
가 나열 localhost
됩니다.
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}
다시 말하지만, 정적 임대를 사용하는 경우에만이 모든 것이 작동합니다.
의견이 충분하지는 않지만 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")
host
명령을 사용하여 DNS 쿼리를 사용 하여 할당 된 IP 주소와 관련된 호스트 이름을 추출합니다. DHCP 서버는 실제로 호스트 이름 옵션 (옵션 12)을 명시 적으로 설정할 수 있습니다.이 옵션은 IP의 DNS 쿼리에서 얻은 호스트 이름과 다를 수 있습니다 (IP에 대한 PTR 레코드가 DNS에 없으면 실패 할 수도 있음) )