web-dev-qa-db-ja.com

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

複数のサーバー(RedHat、Ubuntu)でhostnameをテストしましたが、hostname -fは、信頼できないことが判明し、短い名前のみが返されることがあります( この質問 で説明されています)。

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

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

14
VonC

私はCentOS5でこれを試しました:

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

TCPモードでDNSを照会する必要があります。ご使用の環境でUDPが機能する場合は、「T」オプションを除外してください。


注:Ubuntu guest(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}"
11
Nils

ここに私がfqnを見つけた1つの方法があります:

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

つまり、IPアドレスをnslookupする必要がありました。

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

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

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

たぶんもっと簡単な方法がありますか?

6
VonC

この方法は、ホスト名を正しく構成し、dns設定が正しい場合などにのみ機能します。それがすべてある場合は、fqdnをすでに知っています。

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

マシンがインターネットに直接接続されている場合は、IPアドレスを使用してDNS逆引き要求を行うだけです:Host 1.2.3.4
しかし、これは望ましい答えを与えないことがよくあります(たとえば、グーグルで試してみてください)。

5
Gregory MOUSSAT

しないhostname --fqdnあなたのために働きますか?

5
ThatGraemeGuy

クロスプラットフォームの代替方法で、python(少なくともpython 2.7およびpython 3)

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

Ubuntuでは、hostname -A

2
oarevalo