Saya ingin Ubuntu mendapatkan nama host dan nama DNS dari klien DHCP . Instalasi default Ubuntu 11.10 (Oneiric Ocelot) tidak melakukan itu.
Pertanyaan yang sama ditanyakan dan belum terpecahkan di Forum Ubuntu .
Saya ingin Ubuntu mendapatkan nama host dan nama DNS dari klien DHCP . Instalasi default Ubuntu 11.10 (Oneiric Ocelot) tidak melakukan itu.
Pertanyaan yang sama ditanyakan dan belum terpecahkan di Forum Ubuntu .
Jawaban:
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 eth0
dan wlan0
dengan nama antarmuka tempat Anda ingin mendapatkan nama host. Dalam kebanyakan kasus eth0
dan wlan0
harus 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.
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"
Jawaban d_inevitable hampir memecahkan masalah saya, tetapi tidak sepenuhnya. Masalahnya adalah meskipun:
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
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.
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.d
skrip, 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.local
untuk mendeteksi kapan jaringan muncul dan memaksa pencarian (dalam kasus saya) /etc/hosts
untuk mendapatkan nama host dan kemudian berjalan hostname
dengan 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 localhost
sampai saya dapat menjalankan /etc/init.d/hostname.sh start
setelah 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 ...).
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
hostname
dan domain dengan mengetik hostname -d
. jadi fqdn harus berupa hostname.domain
send host-name "example.com";
untuk mendapatkan alamat IP tertentu, Anda juga dapat meminta satu request host-name;
.
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.
Perhatikan bahwa ketika menggunakan Ubuntu 18.04 skrip tie-in tidak lagi diperlukan. Jika nama host dari instalasi diatur ke localhost
dalam /etc/hostname
klien DHCP akan mengatur nama host secara otomatis pada saat startup menggunakan nama yang dikeluarkan oleh DHCP, jika ada. Saat menjalankannya hostnamectl
akan terdaftar localhost
sebagai nama host permanen, dan apa pun masalah DHCP sebagai nama host sementara.
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
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.
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")
host
perintah) 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 )