Я хочу, щоб Ubuntu отримав ім'я хоста та DNS-ім'я від клієнта DHCP . Установка Ubuntu 11.10 (Oneiric Ocelot) за замовчуванням не робить цього.
Я хочу, щоб Ubuntu отримав ім'я хоста та DNS-ім'я від клієнта DHCP . Установка Ubuntu 11.10 (Oneiric Ocelot) за замовчуванням не робить цього.
Відповіді:
Існує спосіб зробити це за допомогою невеликого сценарію для гака dhcp, як описано тут .
Створіть новий файл:
sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname
і вставте наступний код:
#!/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
Замініть eth0
і wlan0
назви інтерфейсів, з яких потрібно отримати ім'я хоста. У більшості випадків eth0
і wlan0
повинно залишатися таким же.
Переконайтеся, що вона читається ...
chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname
Це все. При наступному відповіді dhcp ім'я хоста оновиться автоматично.
Ви можете отримати ім'я хоста від свого DHCP-сервера - це частина специфікації DHCP.
https://tools.ietf.org/html/rfc1533#section-3.14
"Цей параметр вказує ім'я клієнта"
Відповідь d_inevitable майже вирішила мою проблему, але не повністю. Проблема полягала в тому, що хоча:
Сервер DHCP надсилав ім'я хоста (додавши
option host name 'client1'
в dhcpd.conf), і я фактично перевірив це, захопивши та проаналізувавши зміст пропозиції DHCP за допомогою проводки
Клієнт DHCP очікував імені хоста від сервера DHCP (додавши його
request host-name
в dhclient.conf)
Клієнт не отримував нового імені хоста (легко перевіряється введенням тексту)
hostname
в терміналі та отримання старого імені хоста, або немає імені хоста, якщо я видалив вміст / файл). У результаті запропоноване рішення d_inevitable було лише копіюванням порожнього рядка.
Щоб вирішити це, я застосував сирий розчин, якого, як правило, не слід дотримуватися, якщо ви не відчайдушно змусите його працювати, як я.
Спочатку відкрийте з можливістю редагування сценарій керування клієнтом DHCP:
sudo vi /sbin/dhclient-script
Там вам доведеться знайти функцію
set_hostname()
Просто використовуйте пошук, і він повинен підійти прямо. Тепер, принаймні на моєму комп’ютері, ця функція має три умови «інше», капсульовані один до одного:
# встановити ім'я хоста set_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 }
Тепер, вам потрібно примусити присвоїти нове ім’я хосту своєму хосту, незважаючи ні на що. Тому ви хочете прокоментувати два інкапсульовані, якщо тоді. Результат повинен виглядати приблизно так:
# встановити ім'я хоста set_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 }
Тепер d_inevitable або це має працювати як очікувалося. Сподіваюся, що це допоможе, якщо ви перебуваєте в подібному відчайдушному розчаруванні, як я.
Відповідь Олі є явно хибною ("Ви не отримаєте своє ім'я хоста від сервера DHCP"), про що свідчать інші відповіді тут, а також мій останній досвід роботи системи RHEL7. Згадана система отримала ім'я хоста від сервера DHCP.
Дійсно, у файлах конфігурації DHCP є речі, які повинні зробити це. Наприклад:
host host4 { # verified
hardware ethernet 41:88:22:11:33:22;
fixed-address 192.168.0.4;
option host-name "host4";
}
Потрібно сказати цьому хосту, що його ім'я host4.
Як виявилося, dcclient isc НЕ ЗНАЧИТЬСЯ ДЛЯ ПІДТРИМКИ ЦЬОГО!
Однак dhcpcd5 робить це поза коробкою. Зупиніть dhclient, встановіть dhcpcd5, запустіть dhcpcd, поновіть оренду та пуф, ім'я хоста на вашому клієнті DHCP встановлюється на ім'я, надіслане з сервера DHCP. Ні dhclient-exit-hooks.d
сценаріїв, ні взломів rc.local
, нічого.
На закінчення, я витратив багато часу, намагаючись змусити цю роботу працювати за допомогою dhclient ISC. Абсолютно ніякої радості, навіть коли сервер надсилає ім'я хоста.
Моє початкове рішення проблеми - написання милого коду, rc.local
щоб виявити, коли з’явилася мережа, і змусив (у моєму випадку) пошуку /etc/hosts
отримати ім'я хоста, а потім запустити hostname
це ім'я хоста. Це працює, але, поки мережа не з'явиться, ваше ім'я хоста, ймовірно, помиляється (при першому розгортанні хоста я видаляю /etc/hostname
, тому ім'я хоста localhost
до тих пір, поки я не можу запуститись, /etc/init.d/hostname.sh start
коли мережа з’явиться - тому при першому отриманні нового імені вам потрібно завантажитися двічі - один раз, щоб отримати ваше ім’я хоста, і один раз, щоб мати це ім’я доступне, коли все починається ...).
Ви не отримаєте своє ім'я хоста від сервера DHCP.
Ви можете надіслати ім'я хоста на сервер, що може змінити призначений вам IP. Ви можете змінити те, яке ім'я надсилається, відредагувавши підключення мережевого менеджера (поле називається ідентифікатором клієнта DHCP) або ви можете редагувати (як root) /etc/dhcp/dhclient.conf
. Шукайте рядок, який говорить:
send host-name "<hostname>";
... і змінити <hostname>
все, що завгодно.
За замовчуванням Ubuntu отримає свої настройки DNS від маршрутизатора (якщо він надсилає їх), але я підозрюю, що ви говорите про l ocal DNS / mDNS, де ви можете отримати доступ до інших комп'ютерів за своїм ім'ям хоста. Це називається Ahavi або Zeroconf в Ubuntu, і він встановлений за замовчуванням.
Ви повинні мати доступ до свого комп’ютера за допомогою <hostname>.local
hostname
та домен, ввівши hostname -d
. тож це fqdn має бути hostname.domain
send host-name "example.com";
, щоб отримати конкретну IP-адресу, ви можете так само запросити його request host-name;
.
Якщо виявлено, що може бути помилка скриптів dhcpclient. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
Спробуйте очистити $ old_host_name на ip renew
echo unset old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname
Також статичне / etc / hostname, схоже, має чіткість щодо відповіді dhcp, тому залиште його порожнім
> / etc / ім'я хоста
Тестується на сервері ubuntu 14.04 та dnsmasq.
Зауважте, що при використанні Ubuntu 18.04 сценарії зв'язання більше не потрібні. Якщо ім'я хоста установки встановлено localhost
в /etc/hostname
клієнті DHCP, воно автоматично встановлює ім'я хоста при запуску, використовуючи ім'я, видане DHCP, якщо воно є. Під час hostnamectl
його запуску він відображатиметься localhost
як постійне ім'я хоста, а також те, що DHCP видає як перехідне ім'я хоста.
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname
Відповідь залежить від того, ви використовуєте статичну оренду на своєму DHCP-сервері чи ні. Якщо у вас є, не потрібно отримувати ім’я хоста від DNS. Ви можете змінити цей рядок у рішенні d_inevitable
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
до
hostname=${new_host_name}
Але це має відбутися автоматично, якщо для вашого імені хоста спочатку встановлено localhost.localdomain, тому вам не потрібно писати сценарій. Однак якщо ви хочете встановити ім'я хоста на FQDN, вам потрібно буде змінити сценарій d_inevitable на
hostname=${new_host_name}.${new_domain_name}
Знову ж таки, все це працює лише в тому випадку, якщо ви використовуєте статичну оренду.
У мене немає достатньої репутації для коментування, але я хотів би підказати попередню відповідь, оскільки це майже вирішило проблему для мене за допомогою гачка dhclient.
Я виявив, що, використовуючи стандартний ISC DHCP-сервер чомусь, вищезгаданий гак видає ім'я хоста із знаком "." символ періоду в кінці імені хоста з певних причин.
Отже, у попередній відповіді вам може знадобитися "вирізати" сторонній період за допомогою sed:
hostname=$(host $new_ip_address | cut -d ' ' -f 5)
Стають:
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
host
команди) для вилучення імені хоста, пов'язаного з призначеною IP-адресою. DHCP-сервери можуть фактично встановити параметр імені хоста (опція 12), який потенційно може відрізнятися від імені хоста, який ви отримуєте з запиту DNS в IP-адресі (це також може бути збійним, якщо на DNS не існує запису PTR для IP-адреси )