Попробуйте что-то вроде
export IP=`( dig ${HOSTNAME} A +short | tail -n1; \
dig ${HOSTNAME} AAAA +short | tail -n1 ) \
| head -n1`
Это даст вам:
- Для хоста с хотя бы одним IPv4-адресом (одним из) IPv4-адресом
- Для хоста без IPv4-адресов, но с хотя бы одним IPv6-адресом (одним из) IPv6-адресов
- Для хоста без адреса (IPv4 или IPv6) вообще в DNS или в случае сбоя распознавателя пустое значение
Если вам не нужны возможности IPv4 или IPv6 (кажется, ваш вопрос указывает на то, что вы в основном заинтересованы в адресе IPv4), просто удалите эту команду dig
(A
- IPv4, AAAA
- IPv6). Итак, если вас интересуют только адреса IPv4:
export IP=`dig ${HOSTNAME} A +short | tail -n1`
tail -n1
гарантирует, что вы получите IP-адрес (в случае CNAME
и, возможно, других типов записей, dig
выводит ссылочное каноническое имя в первой строке). head -n1
гарантирует, что вы получите только один адрес, возвращая только первую строку оставшихся выходных данных (не требуется в случае только одного семейства адресов, поскольку tail
вернет только один адрес). Поскольку записи DNS обычно обслуживаются в циклическом порядке, нет гарантии, какой точный адрес будет возвращен для хостов с несколькими адресами.
Я не слишком знаком с написанием функций bash, но должно быть относительно легко превратить это в функцию.