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

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

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

16
задан 8 January 2015 в 00:36

10 ответов

Существует способ сделать это с небольшим сценарием для рычага 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 Ваше имя хоста обновит автоматически.

6
ответ дан 8 January 2015 в 00:36

Можно получить имя хоста от сервера DHCP - это - часть спецификации DHCP.

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

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

4
ответ дан 8 January 2015 в 00:36

ответ 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 () {локальный 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
    fi
fi }

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

# установите имя хоста set_hostname () {локальный 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
    #fi
fi }

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

3
ответ дан 8 January 2015 в 00:36

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

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

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

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

Стал бы:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
0
ответ дан 8 January 2015 в 00:36

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

Попытайтесь убрать, $old_host_name на IP возобновляют

отзовитесь эхом сбрасывает old_host_name>/etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname

Также статический/etc/hostname кажется, имеет prority по ответу dhcp, так оставьте его пустым

>/etc/hostname

Протестированный на человечности 14.04 и dnsmasq сервере.

1
ответ дан 8 January 2015 в 00:36

Возражение Oli очевидно недобросовестно ("Вы не получаете свое имя хоста от сервера 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 после того как сеть подходит - поэтому, сначала получая новое имя необходимо загрузиться дважды - однажды для получения имени хоста, и однажды иметь то имя в наличии, когда все запускает...).

3
ответ дан 8 January 2015 в 00:36

Ответ зависит от того, используете ли Вы статические арендные договоры о своем сервере 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
ответ дан 8 January 2015 в 00:36

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

Можно отправить имя хоста на сервер, который может изменить IP, который Вам присваивают. Можно изменить, какое имя отправляется любого путем редактирования соединения Администратора сети (поле называют идентификатором клиента DHCP), или можно отредактировать (как корень) /etc/dhcp/dhclient.conf. Ищите строку, которая говорит:

send host-name "<hostname>";

... и изменение <hostname> к чему Вам нравится.


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

Необходимо смочь получить доступ компьютеру <hostname>.local

1
ответ дан 8 January 2015 в 00:36

Ни один, с чем я столкнулся. Единственная проблема, которую я имел, была, когда я сначала установил, она гадила, потому что uefi система взяла dvdrw, из которого она загрузилась прочь. После того как я вошел и сказал этому, что это было основное устройство загрузки, это хорошо работало.

21
ответ дан 24 September 2019 в 22:18

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

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname
0
ответ дан 23 November 2019 в 02:35

Другие вопросы по тегам:

Похожие вопросы: