Утиліта командного рядка Linux для вирішення імен хостів спочатку за допомогою / etc / hosts


36

Є кілька утиліт командного рядка для імен рішучості господарів ( host, dig, nslookup), проте всі вони використовують неймсервери виключно, в той час як додатки , в загальному погляді на /etc/hostsпершу ( з допомогою gethostbyname я вважаю).

Чи є утиліта командного рядка для вирішення імен хостів, яка веде себе як звичайна програма, таким чином, заглядаючи /etc/hostsспочатку і лише потім запитуючи сервер імен?

(Я усвідомлюю, що це, мабуть, буде як 3 рядки c, але мені це потрібно в декількох портативних скриптах оболонки.)


Чи можете ви поясніть свою ситуацію ще трохи? Чи awk '/hostname/ { print $1 }' /etc/hostsдопомагає?
— кванта

@quanta Насправді поточне рішення - grep / sed магія на / etc / hosts. Я хотів зробити це більш загальним із запасом.
— Зулан

Відповіді:


56

Це легко досягти за допомогою getent:

getent hosts 127.0.0.1

getentзробить пошук для будь-якого типу даних, налаштованих у nsswitch.conf.


Це інструмент, який я використовую у своїх альпійських докерних контейнерах, які не мають іншого механізму, як digабо nslookup.
— Бруно Броноський

26

Один інструмент, який би працював, це getent. Таким чином, ви можете використовувати getent hosts www.google.com, або getent hosts localhost. Він отримає записи з баз даних, як зазначено в конфігурації перемикача послуг імен /etc/nsswitch.conf.


1
Так, але це не відпаде на DNS.
— повільний отрут

Ні, це вирішує в порядку nsswitch.conf.
— cjc

@slowpoison, Погляньте на конфігурацію nsswitch. Моя система має files dnsдля хостів, що означає / etc / hosts консультується, а потім і DNS-рішення. Ваша конфігурація може бути різною.
— Зоредаче

@cjc, це так. Я не думаю, що я спробував це правильно.
— повільний отрут

@Zoredache, я дуже вражений getent. Дякуємо за вступ до цієї команди.
— повільний отрут

8

Ви можете використовувати обгортку gethostbyname () (застарілий), наприклад:

python -c 'import socket;print socket.gethostbyname("www.google.com")'

Або обгортка getaddrinfo (), наприклад:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

Зауважте, що getaddrinfo поверне всі екземпляри як список. Остання частина команди вибирає лише перший кортеж. Це також може повернути адреси IPv6.


1
Це буде працювати, але це вже деякий час застаріло. Дивіться linux.die.net/man/3/gethostbyname .
— Кайл Сміт

Дякую, я про це не знав. ;)
— Мірча Вутковичі

Майте нагороду. Жоден інший напівпереносний одноколісний не пропонується.
— user239558

Якщо це є корисним для когось іншого, я створив версію Python 3 з кількома параметрами командного рядка: github.com/acdha/unix_tools/blob/master/bin/getaddrinfo
— Кріс Адамс

6

resolveip зробимо це.

Як не дивно, це частина пакетів mysql-сервера на RHEL та Ubuntu.


6

Ви можете використовувати [свою улюблену мову тут], щоб написати сценарій, який викликає getnameinfo . Ось як слід робити це бінарні файли (як, наприклад, ping), тож ви гарантовано отримаєте те саме лікування.


6

Використовуйте getent ahosts, наприклад:

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

Ви отримаєте всі адреси IPv4 та IPv6 через резолюцію glibc (таким чином, використовуючи /etc/hostsпершу, як зазвичай налаштовано /etc/nsswitch.conf).

Не використовуйте getent hosts, оскільки це дасть вам адреси IPv6 або IPv4 (не обидва), і обраний протокол може бути не таким, який не працює. Дійсно, адреси IPv6, як правило, є кращими, але в деяких місцях дані IPv6 фільтруються (не підтримуються) маршрутизаторами.



2

Ви можете бути справді хакі, і використовуйте arp:

arp -n somehostname | tr -d '()' | awk '{print $2}'

але це було б дуже потворно, тому не варто цього робити.


2

getent hostsзламаний. Він надає перевагу IPv6-адресам, gai.confмає бути налаштований на перевагу ipv4, але ....

Perl gethostbynameвикористовує перевагу в/etc/nsswitch.conf

hosts: files dns

Тож це працює так, як getent hostsмає працювати для мене.

Також:

perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

повинні працювати.


5
Він не порушений, він просто не використовує getaddrinfo (який читає /etc/gai.conf). Щоб використовувати гетадрінфо, запустіть getent ahosts.
— craig65535

1

Спробуйте це:

if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then
    ip=`awk '/hostname/ { print $1 }' /etc/hosts`
else
    ip=`host hostname | awk '/hostname has address/ { print $4 }'`
fi

-1

Наступна команда виконає пошук через DNS / etc / hosts через прямий пошук сервера DNS.

ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/"

Ця команда спробує пінг домену (у даному випадку google.com) один раз із затримкою очікування 2 секунди, отримає перший рядок команди PING, в якому буде вказано "PING google.com (216.58.199.36) 56 (84 ) байт даних ", а потім скористайтеся редактором потоку (sed), щоб виявити перший набір дужок і витягти дані з нього, які є IP-адресою, яку ми шукаємо.

ПРИМІТКА: вираз регулярного вираження не буде працювати, якщо в URL-адресі є дужки (також круглі дужки), але це буде рідкісним випадком.

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