Сценарій або інструмент для отримання IP-адреси віддаленого хоста


4

Я хочу встановити змінну середовища з IP-адресою даного віддаленого хоста. Це рішення, до якого я прийшов:

export IP=`curl http://network-tools.com/default.asp?host=www.example.com | 
       grep -oE '<br>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | 
       cut -c5-`

Це добре працює, але у мене є кілька питань:

  1. Чи є простий інструмент для отримання однакового результату? Мені потрібно, щоб він працював через проксі-сервер, який обмежує імена хостів, тому я використовую сторінку мережевих інструментів.
  2. Як я можу зробити його функцією імені хоста? щось подібне до getIP (ім'я хоста)

№3 - це зовсім інше питання, ніж два інших, і, як це нині існує, надзвичайно широке. Я сумніваюся, що навіть можна відповісти гарним чином, як це написано зараз.
CVn

Відповіді:


5

Спробуйте щось на кшталт

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, але це має бути відносно легко перетворити це на функцію.


Більшість стеків віддають перевагу IPv6, якщо вони доступні; отже, ви, мабуть, хочете і tail -n 1на найвищому рівні, якщо ви хочете відобразити порядок вирішення хосту. Знову ж таки, весь цей підхід також не поважає NIS, або /etc/hosts, або nsswitch.conf, і все ж я його регулярно використовую на машинах, де resolveip -sце не обов’язково, тому, можливо, я занадто педантичний. ;)
BMDan

@BMDan Фрагмент у запитанні навіть не підтримує IPv6, тому що (швидше за все, це вже два роки), чому я пішов із цим замовленням.
CVn

Я не впевнений, що розумію ваше значення. Фрагмент, який ви надали, явно запитує і A, і AAAA, тому він відомий IPv6. Я погоджуюсь настільки, як ваше твердження, що ви поділяєте функціональність з оригіналом, але я думаю, що мета полягає в тому, щоб покращити те, що було в питанні, а не просто проаналізувати його недоліки.
BMDan

2

Спробуйте наступне:

  • host www.example.com
  • nslookup www.example.com
  • dig www.example.com

Залежно від того, скільки додаткової інформації ви хочете, обрали відповідного кандидата.


Дякую за вашу відповідь, я спробував усі три, але вони, здається, не спрацювали (в моєму контексті). Наприклад, hostповертає повідомлення host www.example.com not found: 3(NXDOMAIN). Я також створив файл etc / resolutionv.conf як з ip dns-сервера, отриманим за допомогою команди, так ipconfig /allі з ip публічного dns googles 8.8.8.8 без успіху. Я побоююсь, що проблема виникає через якесь обмеження, яке встановлює безпека моєї мережі.
Естебан Креспі

Це виглядає як проблема з роздільною здатністю DNS на вашій машині. Тут digможе стати в нагоді команда, яка дозволяє вказати сервер імен для використання, наприклад dig @ns.example.com www.example.com, використовуватиме ns.example.comяк сервер імен (тут ви також можете вказати IP-адресу). nslookupтакож дозволяє це (будь ласка, зверніться man nslookupдо деталей). hostбуло б особливо приємно для вас, оскільки він повертає лише IP-адресу (без додаткової інформації для фільтрації), але для цього потрібна роздільна здатність DNS безпосередньо на хості.
Іззи
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.