Cara mendapatkan nama host dari server DHCP

Jawaban:

6

Ada cara untuk melakukannya dengan skrip kecil untuk hook dhcp seperti dijelaskan di sini .

Buat file baru:

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

dan rekatkan kode berikut:

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

Ganti eth0dan wlan0dengan nama antarmuka tempat Anda ingin mendapatkan nama host. Dalam kebanyakan kasus eth0dan wlan0harus tetap sama.

Pastikan itu bisa dibaca ...

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

Itu saja. Pada respons dhcp berikutnya, nama host Anda akan diperbarui secara otomatis.

d_inevitable
sumber
skrip ini sebenarnya menggunakan kueri DNS (menggunakan hostperintah) untuk mengekstrak nama host yang terkait dengan alamat IP yang diberikan. Server DHCP sebenarnya dapat secara eksplisit mengatur opsi nama host (opsi 12), yang berpotensi berbeda dari nama host yang Anda peroleh dari permintaan DNS pada IP (ini berpotensi juga gagal, jika tidak ada catatan PTR untuk IP yang ada pada DNS )
Ale
4

Anda bisa mendapatkan nama host dari server DHCP - itu adalah bagian dari spesifikasi DHCP.

https://tools.ietf.org/html/rfc1533#section-3.14

"Opsi ini menentukan nama klien"

Dave Morris
sumber
3
Bagaimana Anda mendapatkan server untuk mengirimkannya?
Olathe
3

Jawaban d_inevitable hampir memecahkan masalah saya, tetapi tidak sepenuhnya. Masalahnya adalah meskipun:

  1. Server DHCP mengirim nama host (dengan menambahkan

    option host name 'client1' 
    

    di dhcpd.conf) dan saya benar-benar memverifikasinya dengan menangkap dan menganalisis isi tawaran DHCP dengan wireshark

  2. Klien DHCP mengharapkan nama host dari server DHCP (dengan menambahkan

    request host-name 
    

    di dhclient.conf)

Klien tidak mendapatkan nama host baru (mudah diverifikasi dengan mengetik

hostname

di terminal dan mendapatkan nama host lama, atau tidak ada nama host jika saya telah menghapus konten / file). Akibatnya, solusi yang diajukan oleh d_inevitable hanya menyalin string kosong.

Untuk mengatasi itu, saya menerapkan solusi kasar, yang umumnya tidak boleh diikuti kecuali jika Anda putus asa untuk membuatnya bekerja, seperti saya.

Pertama, buka dengan kemampuan edit skrip kontrol klien DHCP:

sudo vi /sbin/dhclient-script

Di sana, Anda harus mencari fungsi

set_hostname()

Cukup gunakan pencarian dan itu akan muncul. Sekarang, setidaknya di komputer saya, fungsi ini memiliki tiga kondisi if-then-else, yang dienkapsulasi satu sama lain:

# set nama host set_hostname () {local_hostname lokal

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 }

Sekarang, yang Anda butuhkan adalah memaksakan penugasan nama host baru ke host Anda, apa pun yang terjadi. Karena itu Anda ingin mengomentari keduanya yang dienkapsulasi jika-maka-lain. Hasilnya akan terlihat seperti:

# set nama host set_hostname () {local_hostname lokal

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 }

Sekarang d_inevitable atau ini seharusnya bekerja seperti yang diharapkan. Harapan itu membantu jika Anda berada dalam frustrasi yang sama putus asa seperti saya.

George
sumber
3

Jawaban Oli terbukti salah ("Anda tidak mendapatkan nama host Anda dari server DHCP"), sebagaimana dibuktikan oleh jawaban lain di sini, dan juga oleh pengalaman saya baru-baru ini pada sistem RHEL7. Sistem tersebut mendapatkan nama host-nya dari server DHCP.

Dan, memang, ada beberapa hal dalam file konfigurasi DHCP yang seharusnya mewujudkannya. Sebagai contoh:

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

Seharusnya memberi tahu host itu bahwa namanya host4.

Ternyata, dhclient isc TIDAK MUNCUL UNTUK MENDUKUNG INI!

Namun, dhcpcd5 tidak, di luar kotak. Hentikan dhclient, instal dhcpcd5, jalankan dhcpcd, perpanjang kontrak Anda, dan poof, nama host Anda pada klien DHCP diatur ke nama yang dikirim dari server DHCP. Tidak ada dhclient-exit-hooks.dskrip, tidak ada retasan rc.local, tidak ada.

Sebagai catatan akhir, saya telah menghabiskan banyak waktu untuk mencoba ini berfungsi menggunakan dhclient ISC. Sama sekali tidak ada sukacita, bahkan ketika server mengirim nama host.

Solusi awal saya untuk masalah ini adalah menulis beberapa kode imut rc.localuntuk mendeteksi kapan jaringan muncul dan memaksa pencarian (dalam kasus saya) /etc/hostsuntuk mendapatkan nama host dan kemudian berjalan hostnamedengan nama host itu. Ini berfungsi, tetapi sampai jaringan muncul hostname Anda mungkin salah (ketika pertama kali menyebarkan host, saya menghapus /etc/hostname, sehingga nama host localhostsampai saya dapat menjalankan /etc/init.d/hostname.sh startsetelah jaringan muncul - jadi ketika pertama kali mendapatkan nama baru Anda perlu boot dua kali - satu kali untuk mendapatkan nama host Anda, dan satu kali agar nama itu tersedia saat semuanya dimulai ...).

RustyCar
sumber
1

Anda tidak mendapatkan nama host Anda dari server DHCP.

Anda dapat mengirim nama host Anda ke server, yang dapat mengubah IP yang Anda tetapkan. Anda dapat mengubah nama apa yang dikirim baik dengan mengedit koneksi Network Manager Anda (bidang ini disebut DHCP Client ID) atau Anda dapat mengedit (sebagai root) /etc/dhcp/dhclient.conf. Cari baris yang mengatakan:

send host-name "<hostname>";

... dan ubah <hostname>ke apa pun yang kamu suka.


Secara default Ubuntu akan mendapatkan pengaturan DNS-nya dari router (jika mengirimkannya) tetapi saya curiga Anda berbicara tentang DNS / mDNS lokal di mana Anda dapat mengakses komputer lain dengan nama hostnya. Ini disebut Ahavi atau Zeroconf di Ubuntu dan diinstal secara default.

Anda harus dapat mengakses komputer dengan <hostname>.local

Oli
sumber
Saya memiliki server dns dan dhcp (windows 2008) di jaringan saya. Semut itu memberikan nama host dan nama dns untuk setiap ip, tetapi ubuntu tidak memperbarui nama host dan nama dns. Saya harus dapat melihat nama host yang diberikan ini dengan mengetik hostnamedan domain dengan mengetik hostname -d. jadi fqdn harus berupa hostname.domain
Oguz Bilgic
AFAIR jika klien tidak bergabung dengan domain Windows, server DHCP Windows tidak akan secara dinamis memperbarui entri DNS Windows. Saya tidak begitu yakin ... tergantung pada konfigurasi Windows DHCP / DNS
oddfellow
Secara default 12.04 memiliki baris ini "send host-name = gethostname ();" dan Anda dapat melihat nilai itu dengan mengetikkan "nama host" pada baris perintah. Secara default, ini tidak akan berpengaruh pada jaringan windows. Sesuai pertanyaan awal.
Móż
Meskipun zeroconf diinstal secara default, itu sangat tidak dapat diandalkan. Saya terus terang terkejut ketika berhasil, seperti ping nama host atau nama host. Lokal jarang menghasilkan kesuksesan meskipun tidak ada yang berubah pada jaringan saya dalam beberapa bulan.
Cerin
1
Ini tidak sepenuhnya benar. Meskipun Anda dapat mengirim nama host Anda ke server DHCP send host-name "example.com";untuk mendapatkan alamat IP tertentu, Anda juga dapat meminta satu request host-name;.
Dmitry Grigoryev
1

Jika ditemukan itu bisa menjadi bug skrip dhcpclient. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html

Cobalah untuk membersihkan $ old_host_name di ip renew

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

Juga statis / etc / hostname tampaknya memiliki prioritas lebih dari jawaban dhcp jadi biarkan kosong

> / etc / hostname

Diuji pada ubuntu 14.04 dan server dnsmasq.

Adam
sumber
1

Perhatikan bahwa ketika menggunakan Ubuntu 18.04 skrip tie-in tidak lagi diperlukan. Jika nama host dari instalasi diatur ke localhostdalam /etc/hostnameklien DHCP akan mengatur nama host secara otomatis pada saat startup menggunakan nama yang dikeluarkan oleh DHCP, jika ada. Saat menjalankannya hostnamectlakan terdaftar localhostsebagai nama host permanen, dan apa pun masalah DHCP sebagai nama host sementara.

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname
Justin Scott
sumber
0

Jawabannya tergantung pada apakah Anda menggunakan sewa statis pada server DHCP Anda. Jika ya, tidak perlu mendapatkan nama host dari DNS. Anda dapat mengubah baris ini dalam solusi d_inevitable

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

untuk

hostname=${new_host_name}

Tetapi ini akan terjadi secara otomatis jika nama host Anda awalnya disetel ke localhost.localdomain, jadi Anda tidak perlu menulis skrip. Namun, jika Anda ingin mengatur nama host ke FQDN, Anda harus mengubah skrip d_inevitable

hostname=${new_host_name}.${new_domain_name}

Sekali lagi, semua ini hanya berfungsi jika Anda menggunakan sewa statis.

pengguna248850
sumber
0

Tidak memiliki reputasi yang cukup untuk berkomentar, tetapi saya ingin mendukung jawaban sebelumnya karena hampir memecahkan masalah bagi saya menggunakan kait dhclient.

Saya telah menemukan bahwa menggunakan Server DHCP ISC standar untuk beberapa alasan, hook yang disebutkan di atas menampilkan nama host dengan '.' karakter titik di akhir nama host untuk beberapa alasan.

Jadi, dalam jawaban sebelumnya Anda mungkin perlu "memotong" periode asing dengan sed:

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

Akan menjadi:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
Michael R. Hines
sumber