Jak uzyskać nazwę hosta z serwera DHCP

Odpowiedzi:

6

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ń eth0i wlan0na nazwy interfejsów, z których chcesz uzyskać nazwę hosta. W większości przypadków eth0i wlan0powinien 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.

d_inevitable
źródło
ten skrypt faktycznie używa zapytania DNS (za pomocą hostpolecenia), 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 )
Ale
4

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”

Dave Morris
źródło
3
Jak zmusić serwer do wysłania go?
Olathe
3

Odpowiedź d_inevitable prawie rozwiązała mój problem, ale nie do końca. Problem polegał na tym, że chociaż:

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

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

Jerzy
źródło
3

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.dskryptó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.localcelu wykrycia, kiedy pojawiła się sieć i wymuszeniu (w moim przypadku) wyszukiwania /etc/hostsnazwy hosta, a następnie uruchomienia hostnamez 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 localhostdo momentu uruchomienia /etc/init.d/hostname.sh startpo 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 ...).

Zardzewiały samochód
źródło
1

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

Oli
źródło
Mam serwer dns i dhcp (Windows 2008) w mojej sieci. Ant przypisuje nazwę hosta i nazwę dns do każdego adresu IP, ale ubuntu nie aktualizuje swojej nazwy hosta i nazwy dns. Powinienem być w stanie zobaczyć przypisaną nazwę hosta, wpisując hostnamei domenę, wpisując hostname -d. więc fqdn powinna być nazwą
hosta.domain
AFAIR, jeśli klient nie jest przyłączony do domeny Windows, serwer Windows DHCP nie będzie dynamicznie aktualizował wpisów Windows DNS. Nie jestem jednak do końca pewien ... zależy od konfiguracji DHCP / DNS systemu Windows
ktoś inny
Domyślnie 12.04 ma wiersz „send host-name = gethostname ();” i możesz zobaczyć tę wartość, wpisując „nazwa hosta” w wierszu polecenia. Domyślnie nie będzie to miało wpływu na sieć Windows. Zgodnie z pierwotnym pytaniem.
Móż
Chociaż zeroconf jest instalowany domyślnie, jest strasznie zawodny. Jestem szczerze zaskoczony, kiedy to działa, ponieważ pingowanie nazwy hosta lub hosta. Lokal rzadko kończy się sukcesem, mimo że nic się nie zmieniło w mojej sieci od miesięcy.
Cerin,
1
To nie do końca prawda. Chociaż możesz wysłać swoją nazwę hosta na serwer DHCP send host-name "example.com";w celu uzyskania określonego adresu IP, równie dobrze możesz poprosić o jego podanie request host-name;.
Dmitrij Grigoryev,
1

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.

Adam
źródło
1

Pamiętaj, że podczas korzystania z Ubuntu 18.04 skrypty wiążące nie są już potrzebne. Jeśli nazwa hosta instalacji ustawiony jest localhostw /etc/hostnameklienta DHCP hosta ustawi się automatycznie przy starcie używając nazwy wydane przez DHCP, jeśli jest obecny. Po uruchomieniu hostnamectlbędzie wymieniony localhostjako 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
Justin Scott
źródło
0

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.

użytkownik248850
źródło
0

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")
Michael R. Hines
źródło