Как получить имя хоста с DHCP-сервера

Я хочу, чтобы Ubuntu получала имя хоста и DNS-имя из DHCP клиент. Установка по умолчанию Ubuntu 11.10 (Онейрический Оцелот) этого не делает.

Тот же вопрос был задан и остается нерешенным на Форумы Ubuntu.

Есть способ сделать это с помощью небольшого скрипта для подключения 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 assignmentsif [ "$interface" != "eth0" ] && [ "$interface" != "wlan0" ]then    returnfiif [ "$reason" != BOUND ] && [ "$reason" != RENEW ] \   && [ "$reason" != REBIND ] && [ "$reason" != REBOOT ]then        returnfiecho dhclient-exit-hooks.d/hostname: Dynamic IP address = $new_ip_addresshostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -r 's/((.*)[^\.])\.?/\1/g' )echo $hostname > /etc/hostnamehostname $hostnameecho dhclient-exit-hooks.d/hostname: Dynamic Hostname = $hostname

Заменять eth0 и wlan0 с именами интерфейсов, из которых вы хотите получить имя хоста. В большинстве случаев eth0 и wlan0 должно остаться прежним.

Убедитесь, что он доступен для чтения...

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

Это все. При следующем ответе dhcp ваше имя хоста будет обновлено автоматически.

Ответ Оли явно ложен ("Вы не получаете свое имя хоста с 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.

Как оказалось, dhclient 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-сервера - это часть спецификации DHCP.

https://www.rfc-editor.org/rfc/rfc1533#section-3.14

"Этот параметр указывает имя клиента";

ответ d_inevitable почти решил мою проблему, но не полностью. Проблема заключалась в том, что, хотя:

  1. DHCP-сервер отправлял имя хоста (путем добавления

    option host name 'client1' 

    в dhcpd.conf), и я действительно проверил это, записав и проанализировав содержимое предложения DHCP с помощью wireshark

  2. DHCP-клиент ожидал получить имя хоста от DHCP-сервера (путем добавления

    request host-name 

    в файле dhclient.conf)

Клиент был нет получение нового имени хоста (легко проверить, введя

hostname

в терминале и получение старого имени хоста или отсутствие имени хоста, если я удалил содержимое / файл). В результате предложенное d_inevitable решение заключалось только в копировании пустой строки.

Чтобы решить эту проблему, я применил грубое решение, которому, как правило, не следует следовать, если вы не отчаянно пытаетесь заставить его работать, как это было со мной.

Сначала откройте с возможностью редактирования сценарий управления DHCP-клиентом:

sudo vi /sbin/dhclient-script

Там вам нужно будет найти функцию

set_hostname()

Просто воспользуйтесь поиском, и он должен появиться сразу. Теперь, по крайней мере, на моем компьютере, эта функция имеет три условия if-then-else, инкапсулированные друг в друга:

# установить имя хоста 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    fifi }

Теперь все, что вам нужно, это принудительно присвоить вашему хосту новое имя хоста, несмотря ни на что. Поэтому вы хотите закомментировать два инкапсулированных if-then-else. Результат должен выглядеть примерно так:

# установить имя хоста 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    #fifi }

Теперь d_inevitable или этот должно работать так, как ожидалось. Надеюсь, это поможет, если вы находитесь в таком же отчаянном отчаянии, как и я.

Обратите внимание, что при использовании Ubuntu 18.04 сценарии привязки больше не нужны. Если для имени хоста установки задано значение localhost в /etc/hostname DHCP-клиент автоматически установит имя хоста при запуске, используя имя, выданное DHCP, если оно присутствует. При запуске hostnamectl в нем будет перечислен localhost в качестве постоянного имени хоста и любых проблем DHCP в качестве временного имени хоста.

testaccount@dhcp-hostname:~$ hostnamectl   Static hostname: localhostTransient hostname: dhcp-hostname

Вы не получаете свое имя хоста с DHCP-сервера.

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

send host-name "<hostname>";

... и изменить <hostname> на все, что тебе нравится.


По умолчанию Ubuntu получит свои настройки DNS от маршрутизатора (если он их отправит), но я подозреваю, что вы говорите о local DNS/MDNS где вы можете получить доступ к другим компьютерам по их имени хоста. В Ubuntu это называется Ahavi или Zeroconf, и оно установлено по умолчанию.

Вы должны иметь возможность получить доступ к своему компьютеру с помощью <hostname>.local

Ответ зависит от того, используете ли вы статическую аренду на своем DHCP-сервере или нет. Если это так, то нет необходимости получать имя хоста из DNS. Вы можете изменить эту строку в решении d_inevitable

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

к

hostname=${new_host_name}

Но это должно произойти автоматически, если для вашего имени хоста изначально задано значение localhost.localdomain, поэтому вам не нужно писать сценарий. Однако, если вы хотите установить для имени хоста ПОЛНОЕ доменное имя, вам нужно будет изменить сценарий d_inevitable на

hostname=${new_host_name}.${new_domain_name}

Опять же, все это работает только в том случае, если вы используете статическую аренду.

Если обнаружено, что это может быть ошибка dhcpclient scripts. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html

Попробуйте очистить $old_host_name при обновлении ip-адреса

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

Кроме того, static / etc /hostname, похоже, имеет приоритет над ответом dhcp, поэтому оставьте его пустым

> /etc/имя хоста

Протестировано на ubuntu 14.04 и сервере dnsmasq.

У меня недостаточно репутации, чтобы комментировать, но я хотел бы вернуться к предыдущему ответу, поскольку он почти решил проблему для меня с помощью dhclient-хука.

Я обнаружил, что при использовании стандартного DHCP-сервера ISC по какой-то причине вышеупомянутый хук выводит имя хоста с символом точки '.' в конце имени хоста по какой-то причине.

Итак, в предыдущем ответе вам, возможно, потребуется "вырезать" посторонний период с помощью sed:

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

Стал бы:

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

Сначала получите IP-адрес вашего клиента с вашего DHCP-сервера, затем вы найдете имя хоста клиента в /var/lib/dhcp/dhcpd.leases ищет тот client-hostname записи. HTH