В файле resolv.conf не должно быть внешних DNS-серверов, чтобы гарантировать, что dnsmasq разрешает все DNS-запросы. Изменить на:
nameserver 127.0.0.1
Чтобы разрешить разрешение внешних DNS-имен, используйте dnsmasq в качестве глобального DNS-сервера, указав использовать какой-либо внешний DNS-сервер. Добавить в конфигурационный файл DNSmasq:
--server Specify IP address of upstream servers directly.
server=8.8.8.8
Чтобы заставить dnsmasq разрешать только имена, которые на самом деле могут быть глобальными именами dns, добавьте в файл конфигурации DNSmasq:
# Never forward plain names (without a dot or domain part)
domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv
Чтобы убедиться, что локальные имена разрешаются с помощью /etc/hosts, добавьте в файл DNSmasq:
# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
local=/local./
Вы можете попробовать этот вариант (может быть полезен или нет):
# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts
# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
# as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
# domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
domain=local
Возможно, вы могли бы сделать что-то подобное:
awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2
Где:
FNR
:Номер входной записи в текущем входном файле. NR
:Общее количество входных записей, просмотренных на данный момент. Обратите внимание, что при этом будет считано file1
целиком в память.
Использованиеawk
:
awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2
В этой команде NR==FNR
гарантирует, что {ar[$2]=$0;next}
будет работать только для первого файла, потому что после чтения первого файла FNR
будет установлен на ноль. В выражении {ar[$2]=$0;next}
создается массив ar
, индексированный по $2
, и с next
никаких дальнейших действий не предпринимается.
Выражение ($1 in ar)
определяет, присутствует ли$1
(первое поле второго файла )в индексах массива ar
. Если присутствует, то это печатает ar
и второе поле второго файла с помощью этого оператора {print ar[$1],$2}
.
($1 in ar)
важно, потому что это означает, соответствует ли $1 второго файла индексам из ar
. А ar
индексируется по $2 первого файла. Итак, это проверяет, соответствует ли $1
второго файла $2
первого файла.
Если вы не заботитесь о сохранении исходного порядка файлов, вы можете использоватьjoin
:
# sort the first file:
sort -k2 file1 > nfile1
# Sort the second file:
sort file2 > nfile2
join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file
Или, как предложил @Ed Morton, если вы используете bash
или любую другую оболочку, которая поддерживает замещение процессов, вы можете избежать создания временных файлов таким образом:
join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)