Я хочу, чтобы 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 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 предлагает с wireshark
Клиент 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 или это должны работать как ожидалось. Надежда, которая помогает, если Вы находитесь в подобном отчаянном разочаровании, как я был.
Не имейте достаточной репутации для комментария, но я хотел бы осуществить контрейлерные перевозки на предыдущем ответе, поскольку это почти решило проблему для меня использующий рычаг 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")
Если найдено, который может быть 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 сервере.
Возражение 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
после того как сеть подходит - поэтому, сначала получая новое имя необходимо загрузиться дважды - однажды для получения имени хоста, и однажды иметь то имя в наличии, когда все запускает...).
Ответ зависит от того, используете ли Вы статические арендные договоры о своем сервере 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}
Снова, все это только работает при использовании статических арендных договоров.
Вы не получаете свое имя хоста от сервера DHCP.
Можно отправить имя хоста на сервер, который может изменить IP, который Вам присваивают. Можно изменить, какое имя отправляется любого путем редактирования соединения Администратора сети (поле называют идентификатором клиента DHCP), или можно отредактировать (как корень) /etc/dhcp/dhclient.conf
. Ищите строку, которая говорит:
send host-name "<hostname>";
... и изменение <hostname>
к чему Вам нравится.
Ubuntu по умолчанию получит ее настройки DNS от маршрутизатора (если это отправит их), но я подозреваю, что Вы говорите о локальном DNS/mDNS, где можно получить доступ к другим компьютерам их именем хоста. Это называют Ahavi или Zeroconf в Ubuntu, и это установлено по умолчанию.
Необходимо смочь получить доступ компьютеру <hostname>.local
Ни один, с чем я столкнулся. Единственная проблема, которую я имел, была, когда я сначала установил, она гадила, потому что uefi система взяла dvdrw, из которого она загрузилась прочь. После того как я вошел и сказал этому, что это было основное устройство загрузки, это хорошо работало.
Обратите внимание, что при использовании Ubuntu 18.04 сценарии принудительного ассортимента больше не необходимы. Если имя хоста установки установлено на localhost
в /etc/hostname
клиент DHCP установит имя хоста автоматически при запуске с помощью имени, выпущенного DHCP, если существующий. При выполнении hostnamectl
это перечислит localhost
как постоянное имя хоста, и безотносительно проблем DHCP как переходное имя хоста.
testaccount@dhcp-hostname:~$ hostnamectl
Static hostname: localhost
Transient hostname: dhcp-hostname