Утиліта командного рядка 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.