Назад | Перейти на главную страницу

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

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

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

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

Я пробовал это на 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}"

Вот один из способов найти fqn:

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.

Может есть способ попроще?

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

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

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

Не hostname --fqdn работать на вас?

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

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

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

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

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

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