Я тестировал 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, вероятно, ваш лучший выбор для широкой совместимости.