Ana bilgisayar adını DHCP sunucusundan alma


Yanıtlar:


6

Açıklandığı gibi bir dhcp kanca için küçük komut dosyası ile bunu yapmanın bir yolu yoktur burada .

Yeni bir dosya oluşturun:

sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname

ve aşağıdaki kodu yapıştırın:

#!/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

Değiştir eth0ve wlan0sen host alabilmek istediğiniz arayüzleri adlarla. Çoğu durumda eth0ve wlan0aynı kalmalıdır.

Okunabilir olduğundan emin olun ...

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

Bu kadar. Sonraki dhcp yanıtında ana makine adınız otomatik olarak güncellenir.


bu komut dosyası host, atanan IP adresiyle ilişkili ana bilgisayar adını ayıklamak için aslında bir DNS sorgusu ( komutu kullanarak ) kullanır. DHCP sunucuları, IP üzerindeki bir DNS sorgusundan elde ettiğiniz ana bilgisayar adından potansiyel olarak farklı olabilecek bir ana bilgisayar adı seçeneğini (seçenek 12) açıkça ayarlayabilir (DNS'de IP için PTR kaydı yoksa bu da başarısız olabilir) )
Ale


3

d_inevitable'ın cevabı neredeyse sorunumu çözdü, ama tamamen değil. Sorun şuydu:

  1. DHCP sunucusu bir ana bilgisayar adı gönderiyor (

    option host name 'client1' 
    

    dhcpd.conf'da) ve aslında DHCP teklifinin içeriğini wireshark ile yakalayıp analiz ederek doğruladım

  2. DHCP istemcisi ana bilgisayar adını DHCP sunucusundan bekliyordu (ekleyerek

    request host-name 
    

    dhclient.conf içinde)

İstemci oldu değil yeni sunucu adını (kolayca yazarak doğrulanması için

hostname

terminalde ve eski ana makine adını alıyorum veya içeriği / dosyayı silmiş olsaydım ana bilgisayar adı yok). Sonuç olarak, d_inevitable tarafından önerilen çözüm yalnızca boş bir dize kopyalamaktı.

Bunu çözmek için, benim yaptığım gibi çaresiz olmadıkça genellikle takip edilmemesi gereken bir kabartma çözümü uyguladım.

İlk olarak, DHCP istemci kontrol komut dosyasını düzenleme özelliğiyle açın:

sudo vi /sbin/dhclient-script

Orada, işlevi bulmanız gerekecek

set_hostname()

Sadece aramayı kullanın ve hemen gelmelidir. Şimdi, en azından bilgisayarımda, bu fonksiyonun birbiriyle kapsüllenmiş üç if-then-else koşulu var:

# set ana bilgisayar adı 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 }

Şimdi, ihtiyacınız olan şey, ne olursa olsun, yeni ana bilgisayar adının ana makinenize atanmasını sağlamaktır. Bu nedenle, iki kapsüllenmiş if-then-else yorumunu yapmak istersiniz. Sonuç şöyle görünmelidir:

# set ana bilgisayar adı 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 }

Şimdi d_inevitable veya bu beklendiği gibi çalışmalıdır. Benim gibi umutsuz bir hayal kırıklığı yaşıyorsanız yardımcı olur umarım.


3

Oli'nin yanıtı, buradaki diğer yanıtların ve ayrıca bir RHEL7 sistemindeki son deneyimlerimin de gösterdiği gibi, yanlıştır ("Ana bilgisayar adınızı DHCP sunucusundan almazsınız"). Bahsedilen sistem ana bilgisayar adını DHCP sunucusundan aldı.

Ve aslında, DHCP yapılandırma dosyalarında gerçekleşmesi gereken şeyler vardır. Örneğin:

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

Bu sunucuya adının host olduğunu söylemesi gerekiyor4.

Anlaşıldığı üzere, isc'in dhclient'i DESTEKLEMEYİ GELMEZ!

Ancak, dhcpcd5 kutudan çıkar. DHCP istemcisini durdurun, dhcpcd5'i yükleyin, dhcpcd'yi çalıştırın, kira sözleşmenizi yenileyin ve pof'u seçin, DHCP istemcinizdeki ana bilgisayar adınız DHCP sunucusundan gönderilen ada ayarlanır. Hiçbir dhclient-exit-hooks.dkodlama, hiçbir gardiyanlar rc.local, hiçbir şey.

Bir son not olarak, bunu ISC'nin dhclient'ini kullanmaya çalışmak için çok zaman harcadım. Sunucu ana bilgisayar adını gönderdiğinde bile kesinlikle sevinç yok.

Soruna ilk çözümüm rc.local, ağın ne zaman geldiğini tespit etmek için bazı sevimli kodlar yazmak /etc/hostsve ana bilgisayar adını almak için (benim durumumda) bir aramayı zorlamak ve daha sonra hostnamebu ana bilgisayar adıyla çalışmaktı. Çalışıyor, ancak ağ ortaya çıkana kadar ana bilgisayar adınız büyük olasılıkla yanlıştır (bir ana bilgisayarı ilk dağıtırken kaldırırım /etc/hostname, bu yüzden ana bilgisayar adı ağ geldiğinde localhostçalışana /etc/init.d/hostname.sh startkadar olur - bu yüzden yeni bir ad aldığınızda önyükleme yapmanız gerekir iki kez - bir kez ana bilgisayar adınızı almak ve bir kez de bu adın her şey başladığında kullanılabilir olması ...).


1

Ana bilgisayar adınızı DHCP sunucusundan alamazsınız.

Ana bilgisayar adınızı sunucuya gönderebilirsiniz , bu da atanmış olduğunuz IP'yi değiştirebilir. Ağ Yöneticisi bağlantınızı düzenleyerek (alana DHCP İstemci Kimliği adı verilir) ya da düzenleyerek (kök olarak) gönderilecek adı değiştirebilirsiniz /etc/dhcp/dhclient.conf. Şu satırı arayın:

send host-name "<hostname>";

... ve <hostname>ne istersen değiştir .


Varsayılan olarak Ubuntu, DNS ayarlarını yönlendiriciden alacaktır (gönderirse), ancak diğer bilgisayarlara ana bilgisayar adlarıyla erişebileceğiniz yerel DNS / mDNS hakkında konuştuğunuzdan şüpheleniyorum . Buna Ubuntu'da Ahavi veya Zeroconf denir ve varsayılan olarak yüklenir.

Bilgisayarınıza şu şekilde erişebilmeniz gerekir: <hostname>.local


Ağımda dns ve dhcp (windows 2008) sunucum var. Karınca her ip için ana bilgisayar adı ve dns adı atar, ancak ubuntu ana bilgisayar adını ve dns adını güncellemez. Bu atanmış ana bilgisayar adını yazarak hostnameve etki alanını yazarak görebilmeliyim hostname -d. bu yüzden fqdn hostname.domain olmalı
Oguz Bilgic

İstemci Windows etki alanına katılmamışsa AFAIR, Windows DHCP sunucusu Windows DNS girdilerini dinamik olarak güncelleştirmez. Ama gerçekten emin değilim ... Windows DHCP / DNS yapılandırmasına bağlıdır
oddfellow

Varsayılan olarak 12.04 bu satırı "send host-name = gethostname ();" ve bu değeri komut satırına "hostname" yazarak görebilirsiniz. Varsayılan olarak, bunun bir Windows ağı üzerinde herhangi bir etkisi olmayacaktır. Orijinal soruya göre.
Moz

Her ne kadar zeroconf varsayılan olarak kurulsa da, son derece güvenilir değildir. Hostname veya hostname.local'a ping yapmak aylar içinde ağımda hiçbir şey değişmemesine rağmen nadiren başarı ile sonuçlandığından, açıkçası şaşırdım.
Cerin

1
Bu tam olarak doğru değil. Eğer mümkün olmakla birlikte göndermek ile DHCP sunucusuna ana bilgisayar adını send host-name "example.com";belirli bir IP adresi elde etmek için, sadece de olabilir istemek ile bir request host-name;.
Dmitry Grigoryev

1

Bulunursa dhcpclient komut dosyası hatası olabilir. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html

IP yenilemede $ old_host_name dosyasını temizlemeye çalışın

echo unset old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname

Ayrıca statik / etc / hostname, dhcp cevabı üzerinde bir öneme sahip görünüyor, bu yüzden boş bırakın

> / etc / hostname

Ubuntu 14.04 ve dnsmasq sunucusunda test edilmiştir.


1

Ubuntu 18.04 kullanırken bağlantı komut dosyalarının artık gerekli olmadığını unutmayın. Yüklemek ana makine adı olarak ayarlanırsa localhostiçinde /etc/hostnameDHCP istemcisi eğer varsa, DHCP tarafından verilen adını kullanarak açılışta otomatik olarak hostname ayarlayacaktır. Çalıştırırken hostnamectlo listeler localhostkalıcı hostname olarak ve geçici ana makine olarak her ne DHCP konular.

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname

0

Yanıt, DHCP sunucunuzda statik kiralama kullanıp kullanmadığınıza bağlıdır. Eğer öyleyse, ana bilgisayar adını DNS'den almak gereksizdir. Bu satırı d_inevitable'ın çözümünde değiştirebilirsiniz

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

için

hostname=${new_host_name}

Ancak, ana makine adınız başlangıçta localhost.localdomain olarak ayarlanmışsa, otomatik olarak gerçekleşmelidir, bu nedenle bir komut dosyası yazmanıza gerek yoktur. Ancak, ana bilgisayar adını FQDN olarak ayarlamak istiyorsanız, d_inevitable'ın komut dosyasını şu şekilde değiştirmeniz gerekir:

hostname=${new_host_name}.${new_domain_name}

Yine, tüm bunlar sadece statik kiralar kullanıyorsanız işe yarar.


0

Yorum yapmak için yeterli üne sahip değilim, ama bir dhclient kanca kullanarak benim için neredeyse sorunu çözdüğü için önceki cevaba piggy-back yapmak istiyorum.

Bir nedenden dolayı standart ISC DHCP Sunucusu'nu kullanarak, yukarıda belirtilen kanca bir '.' herhangi bir nedenle ana bilgisayar adının sonundaki nokta karakteri.

Yani, önceki cevapta yabancı dönemi bir sed ile "kesmeniz" gerekebilir:

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

Olacaktı:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.