Unixでbashスクリプトで完全修飾名(FQN)を取得する方法は?


15

私はhostnameいくつかのサーバー(RedHat、Ubuntu)でテストしましたが、hostname -f信頼性が低いことが証明されており、短い名前(この質問で説明しているように)を返すこともあります。

エイリアスでfqnを確認できますhostname -a(エイリアスの1つは探しているfqnです)が、エイリアスの順序は固定されていません。

完全修飾名を確実に取得し、bash変数に保存する別の方法はありますか?


CレコードがAレコードではなく、探しているものである場合、「正しい」FQNがどれであるかをどのようにして知ることができますか?
ニルス

回答:


11

CentOS5でこれを試しました:

host -TtA $SERVERNAME|grep "has address"|awk '{print $1}'

TCPモードでDNSを照会する必要があります。UDPが環境で機能する場合は、「T」オプションを残します。


注:Ubuntu ゲスト (VirtualBox)では動作しません:

git@aHostname:~/$ host -TtA $(hostname -s)
Host aHostname not found: 3(NXDOMAIN)

したがって、すべてのケースをカバーするには:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"

1
私が得たhost -TtA $(hostname -s)|grep "has address"|awk '{print $1}'私のRedHatのサーバーに取り組んで
VonC

これはmac osx 10.11.6で動作しますが、IPごとに1行を提供しますが、osx 10.12.1では動作しません。マシンのセットアップが原因でv12で失敗するのか、本質的に失敗するのかはわかりません。
AnneTheAgile

更新; AD LDAPを使用するMacの場合、最も簡単な方法は解析することです:dsconfigad -show
AnneTheAgile

5

fqnを見つけた1つの方法を次に示します。

fqn=$(nslookup $(hostname -i)) ; fqn=${fqn##*name = } ; fqn=${fqn%.*} ; echo $fqn

言い換えれば、私はnslookup次のようなものを与えるIPアドレスに持っていた:

Server:         128.xxx.yyy.zzz
Address:        128.xxx.yyy.zzz#ww

aa.bb.cc.dd.in-addr.arpa        name = myserver.fully.qualified.name.

そこからは、bash文字列の操作を介して、不要なものを削除するだけの質問でした。

おそらくもっと簡単な方法がありますか?


5

この方法は、ホスト名を正しく構成し、正しいDNS設定などを行っている場合にのみ機能します。すべて揃っている場合は、fqdnがすでにわかっています。

fqdnを取得する信頼できる方法はありません。単一のIPアドレスに複数のfqdnを含めることができ、単一のfqdnに複数のIPアドレスを含めることができます...そして、多くのIPにはfqdnがまったくありません。

マシンがインターネットに直接接続されている場合は、IPアドレスを使用して逆DNS要求を作成します。host 1.2.3.4
しかし、これはたいていの場合、希望する答えを提供しません(たとえばgoogleで試してください)。


確かに、私の状況(世界規模の企業)では、すべてのサーバーにfqnがあり、正しいDNS設定があります。必要なサーバーにはfqdnが1つだけ必要です。
VonC

そのhostため、Aレコードのみを取得する(または一致するルックアップを作成する)ために回答を解析します。
ニルス

@Nils:それは良い提案のようです。私が賛成票を投じて(テスト後)受け入れるために、あなたはそれを答えにすることができますか?
VonC

4

うまくいかないhostname --fqdn


いいえ、質問で明確に述べられています。FQDN情報を取得する必要のあるサーバーhostname --fqdnでは、ホスト名エイリアスの1つとしてfqdnが定義された短い名前を返します。
VonC

右ああ、私は実現しなかった-f--fqdn同じものです。
ThatGraemeGuy


2

クロスプラットフォームの代替として、Pythonの使用を気にしない場合(少なくともPython 2.7およびPython 3で実行)

python -c 'import socket; print(socket.getfqdn())'

-1

OS Xの安全なbashのみの方法。コマンド出力の違いにより、他の* nixフレーバーでは機能しない可能性があります。

fqn=$(nslookup $(hostname) | sed -n s/Name:.//p);

幅広い互換性を確保するには、Pythonが最善の方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.