Как разрешить systemd-resolved прослушивать интерфейс, отличный от loopback?

Я думаю, что вам нужен сценарий, который найдет i) наименьший размер файла в каталоге и его подкаталогах и ii) перечислит все файлы этого наименьшего размера. Если это так, вы можете сделать:

#!/usr/bin/env bash
du -ab "$@" |
    awk -F"\t" '($1<=s || NR==1){
                  s=$1; 
                  a[s]=a[s]"\n\t"$2; 
                  a[-1]=1
                }
                END{
                 if(a[-1]){
                  printf "Smallest file size:%d%s\n",s,a[s]}
                 }'

Или просто запустить его как однострочное:

du -ab | awk -F"\t" '($1<=s || NR==1){s=$1;a[s]=a[s]"\n\t"$2;a[-1]=1}END{if(a[-1]){printf "Smallest file size:%d%s\n",s,a[s]}}'

Пример вывода:

$ a.sh .
Smallest file size:42
    ./foo/file2
    ./file13
    ./file with spaces

Объяснение

  • du -ab : Нет смысла использовать оба -b и -h , они перекрывают друг друга. Это напечатает размеры всех файлов и каталогов.
  • awk -F "\ t" : запустить awk , установив в качестве разделителя поля ввода табуляцию. Таким образом, имена файлов с пробелами будут обрабатываться правильно.
  • ($ 1 <= s || NR == 1) {...} : если размер этого файла меньше наименьшего размера или если это первый найденный файл.
    • a [s] = a [s] "\ n" $ 2; : ассоциативный массив a имеет размер каждого файла в качестве ключа и список файлов ( разделенные новой строкой) в качестве значения. Если этот файл меньше или меньше самого маленького, добавьте его в массив.
    • s = $ 1; : установить s на новый наименьший размер;
    • a [-1] = 1 : это просто используется для того, чтобы сценарий не печатал вывод если файлы не найдены. Мы устанавливаем его на 1 , если был найден хотя бы один файл.
  • END {} : выполняется после того, как все входные данные были прочитаны. На этом этапе s будет наименьшим найденным размером файла.
    • if (a [-1]) {...} : если был найден хотя бы один файл или каталог;
    • printf «Минимальный размер файла:% d% s \ n», s, a [s] : распечатайте его / их.

Примечания

  • Это может иметь дело с именами файлов, которые содержат пробелы (он прерывается, если они содержат табуляцию или новую строку);
  • Он может работать с несколькими целевыми каталогами;
  • Он не возвращает вывода, если нет файлов / каталогов были найдены;
  • Перечисляет все файлы наименьшего размера, а не только последние N (как вы получите, если вы используете tail ).
8
31.05.2018, 11:06
2 ответа

Resuelto no está destinado ni diseñado para su caso de uso -, sino para proporcionar servicios en el loopback local, por lo que la dirección de escucha está codificada.

12
27.01.2020, 20:11

Вы не можете. Как упомянул выше cristian -rodríguez, он был строго разработан для предоставления услуг только для обратной связи.

Даже альтернативное решение с использованием net.ipv4.conf.all.route_localnet=1+ iptables NAT (, такое как https://serverfault.com/questions/211536/iptables-port-redirect-not-working-for-localhost),https://superuser.com/questions/594163/how-do-i-route-a-port-range-in-a-linux-host-to-a-guest-vmhttps://stackoverflow.com/questions/18580637/iptables-redirect-from-external-interface-to-loopbacks-port), не будет работать, так как systemd -resolve явно проверяет, находится ли пункт назначения за пределами петли. сеть. См. приведенный ниже код дляstatic void dns_stub_process_query(Manager *m, DnsStream *s, DnsPacket *p)

    if (in_addr_is_localhost(p->family, &p->sender) <= 0 ||
        in_addr_is_localhost(p->family, &p->destination) <= 0) {
            log_error("Got packet on unexpected IP range, refusing.");
            dns_stub_send_failure(m, s, p, DNS_RCODE_SERVFAIL, false);
            goto fail;
    }

Обходной путь — использовать socatдля прослушивания вашего интерфейса докера и перенаправить его в systemd -. Строка ниже делает свое дело. При необходимости измените его для прослушивания TCP :

.
socat UDP-LISTEN:53,fork,reuseaddr,bind=172.17.0.1 UDP:127.0.0.53:53
13
27.01.2020, 20:11

Теги

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