Программа / приложение или скрипт, который читает / etc / hosts

awk имеет параметр -v для установки переменных. Чтобы установить переменную $ i в awk , вы должны сказать awk -vi = $ i , а затем в операторе awk просто ссылаться на переменную как i , а не как $ i .

Я не тестировал следующее, но попробуйте следующее:

used_pages="$(awk -v i=$i '/i/{nr[NR+9]}; NR in nr' LIST.txt)"
0
02.12.2018, 22:48
2 ответа

Нет специальной программы, которая анализирует этот файл.

Ряд стандартных файлов (, например./etc/hosts)анализируются стандартными библиотечными файлами (, например.gethostbyname(3)). Однако история может быть намного сложнее.

Разрешение имени хоста обычно контролируется записью в /etc/nsswitch.conf.

напр.

% grep hosts /etc/nsswitch.conf
hosts:      files dns

Эта запись указывает подпрограммам распознавателя использовать серверную часть «файлы» и, если результат там не найден, выполнить поиск в DNS. Другие значения могут быть помещены туда (, например. ldapили nis), которые могут изменить способ поиска имен хостов.

Эти подпрограммы обычно называются «службами именования». Те же концепции также используются для поиска имени пользователя (passwd), записей групп(group)и так далее.

Таким образом, когда вы выполните ping a.remote.host, программа pingвызовет библиотечную функцию glibc, которая загрузит подпрограммы, определенные в nsswitch.conf.В результате вы не увидите конкретной программы для поиска; pingделает всю работу сам, через библиотеку и подпрограммы NS.

Существует программа под названием getent, которую можно использовать для поиска по имени; вы указываете «базу данных» (одну из записей вnsswitch.conf)и значение, которое вы хотите найти.

Итак,

getent hosts a.remote.host

выполнит поиск имени в соответствии с правилами, определенными в nsswitch.conf. Это полезно для целей тестирования, а иногда и в сценариях.

---дополнение----

Эта информация взята из комментария Стивена ниже, но она очень полезна, поэтому я добавляю ее к его ответу.

strace getent hosts www.google.com 2>&1 | grep libnss_

сообщит, какая библиотека (или никакая )не использовалась для разрешения имени. Если написано libnss_files, значит, использовалось /etc/hosts. Если указано libnss_dns, значит, использовался DNS. libnss_myhostnameозначает, что ничего не сработало, и резервная система GNU выкинула (и, возможно, вышла из строя ). Если библиотеки нет в списке, то, вероятно, вы использовали числовой адрес, например 127.0.0.1, поэтому преобразователь не понадобился.

2
28.01.2020, 02:18

В системах GNU/Linux /etc/hostsобычно читается библиотеками glibc.

См. документацию GNU по этому вопросу:

Internally, the system uses a database to keep track of the mapping between host names and host numbers. This database is usually either the file /etc/hosts or an equivalent provided by a name server. The functions and other symbols for accessing this database are declared in netdb.h. They are BSD features, defined unconditionally if you include netdb.h.

Все POSIX-совместимые UNIX и UNIX -подобные системы будут следовать этому правилу, поскольку netdb.h является стандартом POSIX . Основное отличие заключается в используемой ими библиотеке C, так как не все системы UNIX используют glibc.

В документации GNU также говорится о таких функциях, как gethostbynameи gethostbyaddr, которые считывают данные, собранные из /etc/hosts. Эти две функции фактически устарели сегодня. Вместо этого следует использоватьgetaddrinfoи getnameinfo.

2
28.01.2020, 02:18

Теги

Похожие вопросы