Есть несколько утилит командной строки для разрешения имен хостов (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-адресе есть круглые скобки, но это будет редким случаем.