Как получить полное имя (FQN) в Unix в скрипте bash?

15

Я провел тестирование hostnameна нескольких серверах (RedHat, Ubuntu) и hostname -fдоказал свою ненадежность, возвращая иногда только короткое имя (как описано в этом вопросе ).

Я могу видеть fqn в псевдонимах: hostname -a(один из псевдонимов - fqn, который я ищу), но порядок псевдонимов не является фиксированным.

Есть ли другой способ надежно получить полное имя и сохранить его в переменной bash?

VonC
источник
Если иногда CNAME - это то, что вы ищете, а не A-запись, откуда вы знаете, какой «правильный» FQN?
Нильс

Ответы:

11

Я попробовал это на CentOS5:

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

Я должен запросить свой DNS в режиме TCP. Если 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}"
Nils
источник
1
Я начал host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'работать на своих серверах
Redhat
Это работает на Mac OSX 10.11.6, хотя дает одну строку на IP, но не на OSX 10.12.1. Я не уверен, что он выйдет из строя на v12 из-за настроек моей машины или по своей сути.
AnneTheAgile
Обновить; для Mac с использованием AD LDAP проще всего разобрать: dsconfigad -show
AnneTheAgile
5

Вот один способ, которым я нашел fqn:

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

Другими словами, у меня был nslookupIP-адрес, который дает мне что-то вроде:

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

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

Оттуда, это был просто вопрос удаления того, чего я не хотел, с помощью манипуляций с bash .

Может быть, есть более простой способ?

VonC
источник
5

Ваш метод работает, только если вы правильно настроили ваше имя хоста, и у вас есть правильные настройки DNS и т. Д. Если у вас есть все это, то вы уже знаете свой fqdn.

Не существует надежного способа получить fqdn. Один IP-адрес может иметь несколько fqdn, а один fqdn может иметь несколько IP-адресов ... и многие IP-адреса вообще не имеют fqdn.

Если ваша машина напрямую подключена к Интернету, просто используйте IP-адрес и сделайте обратный DNS-запрос: host 1.2.3.4
но это очень часто не дает желаемого ответа (попробуйте, например, с Google).

Грегори МУССАТ
источник
Правда, но в моем контексте (всемирное предприятие) все мои серверы имеют fqn и имеют правильные настройки DNS. Серверы, которые мне нужны, должны иметь только один fqdn.
VonC
Так что проанализируйте ответ, hostчтобы получить только A-запись (или сделать соответствующий поиск).
Нильс
@ Nils: это кажется хорошим предложением. Не могли бы вы сделать ответ, чтобы я проголосовал и (после теста) принял?
VonC
4

У тебя не hostname --fqdnработает?

ThatGraemeGuy
источник
Нет, как четко указано в вопросе. На серверах, которые я должен получить информацию о FQDN, hostname --fqdnвозвращает короткое имя с fqdn, определенным как один из псевдонимов имени хоста.
VonC
Ах да, я не осознавал, -fи --fqdnэто одно и то же.
ThatGraemeGuy
2

В Ubuntu вы можете сделать hostname -A

oarevalo
источник
2

Для кроссплатформенной альтернативы, если вы не возражаете против использования Python (работает по крайней мере на Python 2.7 и Python 3)

python -c 'import socket; print(socket.getfqdn())'
jakub.g
источник
-1

Безопасный для bash метод OS X, который, вероятно , не будет работать с другими разновидностями * nix из-за различий в выводе команды:

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

Python, вероятно, ваш лучший выбор для широкой совместимости.

Джошуа Си
источник