Chcę, aby Ubuntu pobierał nazwę hosta i nazwę DNS od klienta DHCP . Domyślna instalacja Ubuntu 11.10 (Oneiric Ocelot) tego nie robi.
To samo pytanie zostało zadane i jest nierozwiązane na forach Ubuntu .
Chcę, aby Ubuntu pobierał nazwę hosta i nazwę DNS od klienta DHCP . Domyślna instalacja Ubuntu 11.10 (Oneiric Ocelot) tego nie robi.
To samo pytanie zostało zadane i jest nierozwiązane na forach Ubuntu .
Odpowiedzi:
Istnieje sposób, aby to zrobić za pomocą małego skryptu dla haka dhcp, jak opisano tutaj .
Utwórz nowy plik:
sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname
i wklej następujący kod:
#!/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
Zamień eth0
i wlan0
na nazwy interfejsów, z których chcesz uzyskać nazwę hosta. W większości przypadków eth0
i wlan0
powinien pozostać taki sam.
Upewnij się, że jest czytelny ...
chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname
To wszystko. Przy następnej odpowiedzi dhcp nazwa hosta zostanie zaktualizowana automatycznie.
Państwo może uzyskać nazwę hosta z serwerem DHCP - jest częścią specyfikacji DHCP.
https://tools.ietf.org/html/rfc1533#section-3.14
„Ta opcja określa nazwę klienta”
Odpowiedź d_inevitable prawie rozwiązała mój problem, ale nie do końca. Problem polegał na tym, że chociaż:
Serwer DHCP wysyłał nazwę hosta (dodając
option host name 'client1'
w pliku dhcpd.conf) i faktycznie go zweryfikowałem, przechwytując i analizując zawartość oferty DHCP za pomocą wireshark
Klient DHCP oczekiwał nazwy hosta od serwera DHCP (dodając
request host-name
w pliku dhclient.conf)
Klient nie otrzymywał nowej nazwy hosta (łatwej do zweryfikowania przez wpisanie)
hostname
w terminalu i uzyskanie starej nazwy hosta lub brak nazwy hosta, jeśli usunąłem zawartość / plik). W rezultacie proponowanym rozwiązaniem przez d_inevitable było tylko skopiowanie pustego ciągu.
Aby rozwiązać ten problem, zastosowałem surowe rozwiązanie, którego na ogół nie należy stosować, chyba że jesteś zdesperowany, aby to zadziałało, tak jak ja.
Najpierw otwórz z możliwością edycji skrypt sterujący klienta DHCP:
sudo vi /sbin/dhclient-script
Tam będziesz musiał zlokalizować funkcję
set_hostname()
Po prostu skorzystaj z wyszukiwania, a powinno się pojawić. Teraz, przynajmniej na moim komputerze, ta funkcja ma trzy warunki „jeśli-to-inaczej”, zamknięte w sobie:
# set host name set_hostname () {lokalny bieżący_nazwa hosta
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 }
Teraz musisz wymusić przypisanie nowej nazwy hosta do hosta, bez względu na wszystko. Dlatego chcesz skomentować dwa enkapsulowane if-then-else. Wynik powinien wyglądać mniej więcej tak:
# set host name set_hostname () {lokalny bieżący_nazwa hosta
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 }
Teraz d_inevitable's lub to powinno działać zgodnie z oczekiwaniami. Mam nadzieję, że to pomaga, jeśli jesteś w takiej desperackiej frustracji jak ja.
Odpowiedź Oli jest wyraźnie fałszywa („Nie otrzymujesz nazwy hosta z serwera DHCP”), o czym świadczą inne odpowiedzi tutaj, a także moje ostatnie doświadczenia z systemem RHEL7. Wspomniany system otrzymał nazwę hosta od serwera DHCP.
Rzeczywiście w plikach konfiguracyjnych DHCP są rzeczy, które mają to umożliwić. Na przykład:
host host4 { # verified
hardware ethernet 41:88:22:11:33:22;
fixed-address 192.168.0.4;
option host-name "host4";
}
Ma powiedzieć temu gospodarzowi, że ma na imię host4.
Jak się okazuje, dhclient ISC NIE WYJAŚNIA SIĘ WSPIERAĆ TO!
Jednak dhcpcd5 robi to od razu po wyjęciu z pudełka. Zatrzymaj dhclient, zainstaluj dhcpcd5, uruchom dhcpcd, odnów dzierżawę i poof, twoja nazwa hosta na kliencie DHCP jest ustawiona na nazwę wysłaną z serwera DHCP. Bez dhclient-exit-hooks.d
skryptów, bez włamań rc.local
, nic.
Na koniec, spędziłem dużo czasu próbując sprawić, aby zadziałało przy użyciu dhclient ISC. Absolutnie nie ma radości, nawet gdy serwer wysyła nazwę hosta.
Moje początkowe rozwiązanie tego problemu polegało na napisaniu ładnego kodu w rc.local
celu wykrycia, kiedy pojawiła się sieć i wymuszeniu (w moim przypadku) wyszukiwania /etc/hosts
nazwy hosta, a następnie uruchomienia hostname
z tą nazwą hosta. Działa, ale dopóki nie pojawi się sieć, twoja nazwa hosta jest prawdopodobnie niepoprawna (po pierwszym wdrożeniu hosta usuwam /etc/hostname
, więc nazwa hosta jest dostępna localhost
do momentu uruchomienia /etc/init.d/hostname.sh start
po uruchomieniu sieci - więc przy pierwszym uzyskiwaniu nowej nazwy musisz uruchomić komputer dwa razy - raz, aby uzyskać nazwę hosta i raz, aby była dostępna, gdy wszystko się uruchomi ...).
Nie otrzymujesz nazwy hosta z serwera DHCP.
Możesz wysłać swoją nazwę hosta na serwer, co może zmienić przypisany adres IP. Możesz zmienić, jaka nazwa jest wysyłana, edytując połączenie Network Managera (pole to nosi nazwę DHCP Client ID) lub możesz edytować (jako root) /etc/dhcp/dhclient.conf
. Poszukaj linii, która mówi:
send host-name "<hostname>";
... i zmień <hostname>
na cokolwiek chcesz.
Domyślnie Ubuntu pobiera ustawienia DNS z routera (jeśli je wysyła), ale podejrzewam, że mówisz o lokalnym DNS / mDNS, w którym możesz uzyskać dostęp do innych komputerów za pomocą nazwy hosta. W Ubuntu nazywa się to Ahavi lub Zeroconf i jest instalowane domyślnie.
Powinieneś być w stanie uzyskać dostęp do swojego komputera przez <hostname>.local
hostname
i domenę, wpisując hostname -d
. więc fqdn powinna być nazwą
send host-name "example.com";
w celu uzyskania określonego adresu IP, równie dobrze możesz poprosić o jego podanie request host-name;
.
Jeśli zostanie znaleziony, może to być błąd skryptów dhcpclient. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
Spróbuj wyczyścić $ old_host_name na ip odnowienia
echo unset stara_nazwa_hosta> /etc/dhcp/dhclient-enter-hooks.d/unset_old_host_host
Również statyczna nazwa pliku / etc / host wydaje się mieć priorytet względem odpowiedzi dhcp, więc zostaw ją pustą
> / etc / nazwa hosta
Testowany na Ubuntu 14.04 i serwerze dnsmasq.
Pamiętaj, że podczas korzystania z Ubuntu 18.04 skrypty wiążące nie są już potrzebne. Jeśli nazwa hosta instalacji ustawiony jest localhost
w /etc/hostname
klienta DHCP hosta ustawi się automatycznie przy starcie używając nazwy wydane przez DHCP, jeśli jest obecny. Po uruchomieniu hostnamectl
będzie wymieniony localhost
jako stała nazwa hosta, a wszelkie problemy z DHCP jako przejściowa nazwa hosta.
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
Odpowiedź zależy od tego, czy używasz statycznych dzierżaw na swoim serwerze DHCP. Jeśli tak, uzyskanie nazwy hosta z DNS nie jest konieczne. Możesz zmienić ten wiersz w rozwiązaniu d_inevitable
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
do
hostname=${new_host_name}
Powinno to jednak nastąpić automatycznie, jeśli nazwa hosta jest pierwotnie ustawiona na localhost.localdomain, więc nie musisz pisać skryptu. Jeśli jednak chcesz ustawić nazwę hosta na FQDN, musisz zmienić skrypt d_inevitable na
hostname=${new_host_name}.${new_domain_name}
Ponownie, wszystko to działa tylko wtedy, gdy korzystasz z leasingu statycznego.
Nie mam wystarczającej reputacji, aby móc komentować, ale chciałbym przywołać poprzednią odpowiedź, ponieważ prawie rozwiązało to problem za pomocą haka dhclient.
Odkryłem, że przy użyciu standardowego serwera DHCP ISC z jakiegoś powodu wyżej wspomniany hak wyświetla nazwę hosta z „.” z jakiegoś powodu znak kropki na końcu nazwy hosta.
Tak więc w poprzedniej odpowiedzi może być konieczne „wycięcie” obcego okresu za pomocą sed:
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
Stanie się:
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
host
polecenia), aby wyodrębnić nazwę hosta powiązaną z przypisanym adresem IP. Serwery DHCP mogą faktycznie jawnie ustawić opcję nazwy hosta (opcja 12), która może potencjalnie różnić się od nazwy hosta uzyskanej z zapytania DNS w adresie IP (może to również potencjalnie zakończyć się niepowodzeniem, jeśli w DNS nie istnieje rekord PTR dla adresu IP )