Як отримати повноцінне ім'я (FQN) на Unix в bash-скрипті?


15

Я пройшов тестування hostnameна декількох серверах (RedHat, Ubuntu) і hostname -fвиявився ненадійним, колись повертаючи лише коротке ім'я (як описано в цьому питанні ).

Я можу бачити fqn у псевдонімах hostname -a(один із псевдонімів - це fqn, який я шукаю), але порядок псевдонімів не встановлений.

Чи є інший спосіб надійно отримати повноцінне ім’я та зберегти його у змінній bash?


Якщо іноді 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}"

1
Я host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'працював на своїх серверах redhat
VonC

Це працює на 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.

Звідти це було лише питання про те, щоб зняти те, що я не хотів, за допомогою маніпуляцій на базі струни .

Може, є простіший спосіб?


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

5

Не hostname --fqdnпрацює для вас?


Ні, як чітко сказано у питанні. На серверах я маю отримати інформацію про FQDN, hostname --fqdnповертає коротке ім'я, fqdn визначається як один із псевдонімів імен хоста.
VonC

О так, я не усвідомлював, -fі --fqdnце те саме.
ThatGraemeGuy


2

Для альтернативи крос-платформи, якщо ви не заперечуєте проти використання python (працює принаймні на python 2.7 та python 3)

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

-1

Безпечний метод bash тільки для OS X, який, ймовірно , не працюватиме іншими * nix ароматами через зміни в командному виведенні:

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

Python, швидше за все, найкращий варіант для широкої сумісності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.