Як отримати ім'я хоста з сервера DHCP


Відповіді:


6

Існує спосіб зробити це за допомогою невеликого сценарію для гака 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 ім'я хоста оновиться автоматично.


цей сценарій фактично використовує DNS-запит (за допомогою hostкоманди) для вилучення імені хоста, пов'язаного з призначеною IP-адресою. DHCP-сервери можуть фактично встановити параметр імені хоста (опція 12), який потенційно може відрізнятися від імені хоста, який ви отримуєте з запиту DNS в IP-адресі (це також може бути збійним, якщо на DNS не існує запису PTR для IP-адреси )
Але


3

Відповідь d_inevitable майже вирішила мою проблему, але не повністю. Проблема полягала в тому, що хоча:

  1. Сервер DHCP надсилав ім'я хоста (додавши

    option host name 'client1' 
    

    в dhcpd.conf), і я фактично перевірив це, захопивши та проаналізувавши зміст пропозиції DHCP за допомогою проводки

  2. Клієнт 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 або це має працювати як очікувалося. Сподіваюся, що це допоможе, якщо ви перебуваєте в подібному відчайдушному розчаруванні, як я.


3

Відповідь Олі є явно хибною ("Ви не отримаєте своє ім'я хоста від сервера 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коли мережа з’явиться - тому при першому отриманні нового імені вам потрібно завантажитися двічі - один раз, щоб отримати ваше ім’я хоста, і один раз, щоб мати це ім’я доступне, коли все починається ...).


1

Ви не отримаєте своє ім'я хоста від сервера DHCP.

Ви можете надіслати ім'я хоста на сервер, що може змінити призначений вам IP. Ви можете змінити те, яке ім'я надсилається, відредагувавши підключення мережевого менеджера (поле називається ідентифікатором клієнта DHCP) або ви можете редагувати (як root) /etc/dhcp/dhclient.conf. Шукайте рядок, який говорить:

send host-name "<hostname>";

... і змінити <hostname>все, що завгодно.


За замовчуванням Ubuntu отримає свої настройки DNS від маршрутизатора (якщо він надсилає їх), але я підозрюю, що ви говорите про l ocal DNS / mDNS, де ви можете отримати доступ до інших комп'ютерів за своїм ім'ям хоста. Це називається Ahavi або Zeroconf в Ubuntu, і він встановлений за замовчуванням.

Ви повинні мати доступ до свого комп’ютера за допомогою <hostname>.local


У мене в мережі є сервер dns і dhcp (Windows 2008). Ant він присвоює ім'я хоста та dns ім'я кожному ip, але ubuntu не оновлює його ім'я хоста та dns. Я повинен мати можливість бачити це призначене ім'я хоста, ввівши hostnameта домен, ввівши hostname -d. тож це fqdn має бути hostname.domain
Oguz Bilgic,

AFAIR, якщо клієнт не приєднався до домену Windows, сервер Windows DHCP не буде динамічно оновлювати записи DNS Windows. Я не дуже впевнений, хоча ... залежить від конфігурації Windows DHCP / DNS
oddfellow

За замовчуванням 12.04 має цей рядок "надіслати ім'я хоста = gethostname ();" і ви можете побачити це значення, ввівши "ім'я хоста" у командному рядку. За замовчуванням це не матиме жодного ефекту для мережі Windows. Відповідно до оригінального питання.
Móż

Хоча zeroconf встановлено за замовчуванням, це жахливо ненадійно. Я відверто здивований, коли це працює, так як пінггінг імені хоста або хоста.мення рідко призводить до успіху, хоча нічого не змінюється в моїй мережі протягом місяців.
Серін

1
Це не зовсім так. Поки ви можете відправити ім'я свого хоста на сервер DHCP send host-name "example.com";, щоб отримати конкретну IP-адресу, ви можете так само запросити його request host-name;.
Дмитро Григор’єв

1

Якщо виявлено, що може бути помилка скриптів 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.


1

Зауважте, що при використанні Ubuntu 18.04 сценарії зв'язання більше не потрібні. Якщо ім'я хоста установки встановлено localhostв /etc/hostnameклієнті DHCP, воно автоматично встановлює ім'я хоста при запуску, використовуючи ім'я, видане DHCP, якщо воно є. Під час hostnamectlйого запуску він відображатиметься localhostяк постійне ім'я хоста, а також те, що DHCP видає як перехідне ім'я хоста.

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

0

Відповідь залежить від того, ви використовуєте статичну оренду на своєму 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}

Знову ж таки, все це працює лише в тому випадку, якщо ви використовуєте статичну оренду.


0

У мене немає достатньої репутації для коментування, але я хотів би підказати попередню відповідь, оскільки це майже вирішило проблему для мене за допомогою гачка 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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.