Ubuntuに DHCP クライアントからホスト名とDNS名を取得させたい。 buntu 11.1 (Oneiric Ocelot)のデフォルトのインストールはそれを行いません。
同じ質問が尋ねられ、Ubuntu Forums では解決されていません。
here のように、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サーバーからホスト名を取得できますcan-これはDHCP仕様の一部です。
https://tools.ietf.org/html/rfc1533#section-3.14
"このオプションはクライアントの名前を指定します"
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であることをホストに伝えることになっています。
結局のところ、iscのdhclientはこれをサポートしていないようです!
ただし、dhcpcd5はそのまま使用できます。 dhclientを停止し、dhcpcd5をインストールし、dhcpcdを実行し、リースを更新し、DHCPクライアントのホスト名をDHCPサーバーから送信された名前に設定します。 dhclient-exit-hooks.d
スクリプトなし、rc.local
のハッキングなし、なし。
最後に、ISCのdhclientを使用してこれを機能させるために多くの時間を費やしました。サーバーがホスト名を送信しても、まったく喜びはありません。
問題に対する私の最初の解決策は、rc.local
にいくつかのかわいいコードを記述して、ネットワークがいつ起動したかを検出し、(私の場合)/etc/hosts
を検索してホスト名を取得し、そのホストでhostname
を実行することでした名前。それは機能しますが、ネットワークが立ち上がるまでホスト名はおそらく間違っています(最初にホストをデプロイするとき、/etc/hostname
を削除するので、ネットワークが立ち上がったら/etc/init.d/hostname.sh start
を実行できるまでホスト名はlocalhost
です-最初に新しい名前を取得するときは、2回起動する必要があります。1回はホスト名を取得し、もう1回はすべての起動時にその名前を使用可能にします...).
d_inevitableの答えは私の問題をほぼ解決しましたが、完全ではありませんでした。問題は次のとおりでした:
DHCPサーバーはホスト名を送信していました(追加することにより
option Host name 'client1'
dhcpd.confで)、wiresharkでDHCPオファーの内容をキャプチャして分析することで実際に検証しました
DHCPクライアントは、DHCPサーバーからホスト名を予期していました(追加することにより
request Host-name
dhclient.conf内)
クライアントはnot新しいホスト名を取得していました(入力することで簡単に確認されました)
hostname
ターミナルで古いホスト名を取得するか、コンテンツ/ファイルを削除した場合はホスト名を取得しません)。その結果、d_inevitableによって提案されたソリューションは、空の文字列をコピーするだけでした。
それを解決するために、私はクラッディングソリューションを適用しました。それは、私がそうであったように、あなたがそれを機能させようと必死でない限り、一般的に従うべきではありません。
まず、編集機能を使用してDHCPクライアント制御スクリプトを開きます。
Sudo vi /sbin/dhclient-script
そこで、機能を見つけなければなりません
set_hostname()
検索を使用するだけで、すぐに表示されます。さて、少なくとも私のコンピューターでは、この関数には、互いにカプセル化された3つの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 fi fi }
ここで、必要なのは、ホスト名に関係なく、新しいホスト名を強制的に割り当てることです。したがって、カプセル化された2つの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 #fi fi }
これで、d_inevitableまたは this が期待どおりに動作するはずです。あなたが私と同じような絶望的な欲求不満に陥っている場合に役立つことを願っています。
見つかった場合、dhcpclientスクリプトのバグである可能性があります。 http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
IP更新時に$ old_Host_nameを消去してみてください
echo unset old_Host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname
また、静的な/ etc/hostnameにはdhcp応答よりも優先度があるようなので、空のままにしておきます
>/etc/hostname
Ubuntu 14.04およびdnsmasqサーバーでテスト済み。
DHCPサーバーからホスト名を取得しません。
ホスト名をサーバーにsendすることができます。これにより、割り当てられているIPが変更される場合があります。送信する名前を変更するには、Network Manager接続を編集するか(フィールドはDHCPクライアントIDと呼ばれます)、または(rootとして)/etc/dhcp/dhclient.conf
を編集します。次の行を探します。
send Host-name "<hostname>";
... <hostname>
を好きなものに変更します。
デフォルトでは、UbuntuはルーターからDNS設定を取得します(送信する場合)が、l ocal 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に設定されている場合、これは自動的に行われるため、スクリプトを記述する必要はありません。ただし、ホスト名を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")