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


回答:


6

ここで説明されているように、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応答で、ホスト名が自動的に更新されます。


このスクリプトは、実際には(hostコマンドを使用して)DNSクエリを使用して、割り当てられたIPアドレスに関連付けられたホスト名を抽出します。DHCPサーバーは、ホスト名オプション(オプション12)を実際に明示的に設定できます。これは、IPのDNSクエリから取得したホスト名と異なる可能性があります(DNSにIPのPTRレコードが存在しない場合、失敗する可能性もあります) )
エール


3

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

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

    option host name 'client1' 
    

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

  2. DHCPクライアントは、DHCPサーバーからホスト名を予期していました(追加することにより

    request host-name 
    

    dhclient.conf内)

クライアントは新しいホスト名を取得していませんでした(簡単に入力できます

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


3

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しますので、ホスト名はネットワークが立ち上がったらlocalhost実行できるまでです/etc/init.d/hostname.sh start-新しい名前を取得するときは起動する必要があります2回-ホスト名を取得するために1回、すべての起動時にその名前を使用可能にするために1回...)。


1

DHCPサーバーからホスト名を取得しません。

あなたはでき送るあなたが割り当てられているIPを変更することができ、サーバにホスト名を。Network Manager接続を編集するか(フィールドはDHCPクライアントIDと呼ばれる)、または(rootとして)編集することにより、送信する名前を変更できます/etc/dhcp/dhclient.conf。次の行を探します。

send host-name "<hostname>";

... <hostname>好きなものに変更します。


デフォルトでは、UbuntuはルーターからDNS設定を取得します(送信する場合)が、ホスト名で他のコンピューターにアクセスできるローカルDNS / mDNSについて話しているのではないかと思います。これはUbuntuではAhaviまたはZeroconfと呼ばれ、デフォルトでインストールされます。

次の方法でコンピューターにアクセスできるはずです。 <hostname>.local


ネットワーク上にdnsおよびdhcp(windows 2008)サーバーがあります。Antはホスト名とDNS名を各IPに割り当てますが、ubuntuはホスト名とDNS名を更新しません。入力するhostnameとこの割り当てられたホスト名が表示され、入力するとドメインが表示されるはずhostname -dです。fqdnはhostname.domainである必要があります
Oguz Bilgic

AFAIRクライアントがWindowsドメインに参加していない場合、Windows DHCPサーバーはWindows DNSエントリを動的に更新しません。私は本当にわからない... Windows DHCP / DNS構成に依存する
-oddfellow

デフォルトでは、12.04の行は「send host-name = gethostname();」です。コマンドラインで「hostname」と入力すると、その値を確認できます。デフォルトでは、これはWindowsネットワークには影響しません。元の質問によると。
モー

zeroconfはデフォルトでインストールされますが、恐ろしく信頼できません。ホスト名またはhostname.localにpingを実行しても、ネットワーク上で何ヶ月も変更がなかったとしても、成功することはめったにないので、私はそれが機能するときに率直に驚いています。
セリン

1
これはまったく正しくありません。あなたがすることができますが送信してDHCPサーバにホスト名をsend host-name "example.com";特定のIPアドレスを取得するために、あなただけのようにもすることができます要求すると1をrequest host-name;
ドミトリーグリゴリエフ

1

見つかった場合、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

Ubuntu 18.04を使用する場合、タイインスクリプトは不要になることに注意してください。インストールのホスト名に設定されている場合localhost/etc/hostname、DHCPクライアント存在する場合、DHCPによって発行された名前を使用して起動時に自動的にホスト名を設定します。実行hostnamectlするとlocalhost、永続的なホスト名、および一時的なホスト名として発行されるDHCP がリストされます。

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname

0

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

コメントするのに十分な評判はありませんが、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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.