web-dev-qa-db-ja.com

DHCPサーバーからホスト名を取得する方法

Ubuntuに DHCP クライアントからホスト名とDNS名を取得させたい。 buntu 11.1 (Oneiric Ocelot)のデフォルトのインストールはそれを行いません。

同じ質問が尋ねられ、Ubuntu Forums では解決されていません。

16
Oguz Bilgic

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

eth0wlan0を、ホスト名を取得するインターフェイスの名前に置き換えます。ほとんどの場合、eth0wlan0は同じままです。

読み取り可能であることを確認してください...

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

それで全部です。次のdhcp応答で、ホスト名が自動的に更新されます。

6
d_inevitable

DHCPサーバーからホスト名を取得できますcan-これはDHCP仕様の一部です。

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

"このオプションはクライアントの名前を指定します"

4
Dave Morris

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回はすべての起動時にその名前を使用可能にします...).

3
RustyCar

d_inevitableの答えは私の問題をほぼ解決しましたが、完全ではありませんでした。問題は次のとおりでした:

  1. DHCPサーバーはホスト名を送信していました(追加することにより

    option Host name 'client1' 
    

    dhcpd.confで)、wiresharkでDHCPオファーの内容をキャプチャして分析することで実際に検証しました

  2. 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 が期待どおりに動作するはずです。あなたが私と同じような絶望的な欲求不満に陥っている場合に役立つことを願っています。

3
George

見つかった場合、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サーバーでテスト済み。

1
Adam

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でコンピューターにアクセスできるはずです

1
Oli

答えは、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
user248850

コメントするのに十分な評判はありませんが、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")
0