Назад | Перейти на главную страницу

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

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

Есть ли утилита командной строки для разрешения имен хостов, которая ведет себя как обычное приложение, таким образом просматривая /etc/hosts сначала и только потом спрашивать сервер имен?

(Я знаю, что это, вероятно, было бы как 3 строки c, но мне это нужно внутри несколько переносимого сценария оболочки.)

Это легко достигается с помощью getent:

getent hosts 127.0.0.1

getent будет выполнять поиск любого типа данных, настроенных в nsswitch.conf.

Один из инструментов, который подойдет, - getent. Итак, вы могли использовать getent hosts www.google.com, или getent hosts localhost. Он будет извлекать записи из баз данных, как указано в вашей конфигурации переключателя службы имен. /etc/nsswitch.conf.

Для более современных реализаций используйте getent ahosts www.google.com который даст несколько результатов.

Использовать 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 фильтруются (не поддерживаются) маршрутизаторами.

Вы можете использовать оболочку 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.

resolveip сделаю это.

Как ни странно, это часть пакетов mysql-server в RHEL и Ubuntu.

Вы можете использовать [здесь ваш любимый язык], чтобы написать сценарий, который вызывает getnameinfo. Именно так должны поступать двоичные файлы (например, ping), чтобы вы были уверены, что получите такое же лечение.

"gethostbyname" версия командной строки:

#!/usr/bin/perl
use Socket;

$host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($host));

$packed_ip = gethostbyname($host);

if (defined $packed_ip) {
    $ip_address = inet_ntoa($packed_ip);
    print "$ip_address\n";
    exit 0
} else {
    warn "$host not found\n";
    exit 1
}

Вы могли бы быть действительно хакерским и использовать arp:

arp -n somehostname | tr -d '()' | awk '{print $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";'

должно сработать.

Попробуй это:

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

Следующая команда выполнит поиск через 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 ) байтов данных », затем с помощью Stream Editor (sed) обнаружите первый набор скобок и извлеките из него данные, которые являются IP-адресом, который мы ищем.

ПРИМЕЧАНИЕ: выражение регулярного выражения не будет работать, если в URL-адресе есть круглые скобки, но это будет редким случаем.