Отключить автодополнение bash для комбинаций определенных команд и определенных типов файлов

Скорее всего, вы используете iptables вместо nftables, так как это используется по умолчанию в Debian buster. Чтобы убедиться, что это так, проверьте(nf_tables):

# ip6tables-restore --version
ip6tables-restore v1.8.2 (nf_tables)

Теперь в руководстве ip6tables всегда было:

-4, --ipv4
This option has no effect in iptables and iptables-restore. If a rule using the -4 option is inserted with (and only with) ip6tables-restore, it will be silently ignored. Any other uses will throw an error. This option allows IPv4 and IPv6 rules in a single rule file for use with both iptables-restore and ip6tables-restore.

Проблема в том, что теперь вы используете ip6tables-nft-restore, а неip6tables-legacy-restore.

В отличиях от устаревших iptables нет упоминания о -4, что означает, что в этом не должно быть различий, но здесь они есть. Это действительно выглядит как ошибка :, либо новая версия ip6tables-nft-restoreдолжна с этим справляться, либо документация должна отражать это как дополнительное отличие, чтобы быть приемлемым.

Кстати, наоборот(-6сiptables-nft-restore)выглядит не лучше :принимается, а не игнорируется, что приводит к -A INPUT -p ipv6-icmp -j ACCEPTв дополнение к -A INPUT -p icmp -j ACCEPTв протоколе IPv4 (это будет никогда не произойдет, за исключением, возможно, специального теста, и IP-стек все равно его проигнорирует ).

Возможные обходные пути:

  1. подайте отчет об ошибке, настаивая на регрессии, которая нарушила бы существующие правила и документацию. Это помогло бы и другим людям.

  2. правила разделения

    разбить ваш файл на два файла, но применить к каждому свой фильтр, например:

    grep -v -- '^ *-4 ' < before > after.v6
    grep -v -- '^ *-6 ' < before > after.v4
    
  3. создать обертку для ip6tables-restoreв /usr/local/sbin/ip6tables-restore, делая примерно то же самое (, а также сделать то же самое для iptables-restore), позволяя сохранить одно правило

  4. Откажитесь (на данный момент )от iptables вместо nftables и вернитесь к устаревшим iptables:

    # readlink -f $(which ip6tables-restore)
    /usr/sbin/xtables-nft-multi
    # update-alternatives --config ip6tables        
    There are 2 choices for the alternative ip6tables (providing /usr/sbin/ip6tables).
    
      Selection    Path                        Priority   Status
    ------------------------------------------------------------
    * 0            /usr/sbin/ip6tables-nft      20        auto mode
      1            /usr/sbin/ip6tables-legacy   10        manual mode
      2            /usr/sbin/ip6tables-nft      20        manual mode
    
    Press  to keep the current choice[*], or type selection number: 1
    update-alternatives: using /usr/sbin/ip6tables-legacy to provide /usr/sbin/ip6tables (ip6tables) in manual mode
    # readlink -f $(which ip6tables-restore)
    /usr/sbin/xtables-legacy-multi
    

    Ссылка соответствующей команды также изменилась, хорошо.

    Сделайте то же самое с iptables.

    Текущие правила по-прежнему работают с nftables. Вы можете сбросить их с помощью iptables-nft-save+ ip6tables-nft-saveи восстановить с помощью iptables-save+ ip6tables-save. Это приведет к тому, что правила будут выполняться дважды :один раз с бэкендом iptables ядра, один раз с бэкендом nftables ядра, и NAT может не всегда работать правильно с этим на ядре 4.19 (обычно побеждает первый загруженный модуль :здесь nft_nat). Лучше перезагрузиться или узнать, как сбросить правила и удалить соответствующие модули (nat )nftables.

  5. принять новые функции и использовать их напрямуюnft.

    Здесь есть команды, которые могут помочь (, но у них та же проблема, что и выше):iptables-translate/ ip6tables-translateи iptables-restore-translate/ ip6tables-restore-translate, но результат обычно требует доработки в любом случае (, особенно с причудливыми соответствует типуu32). У Nftables есть тип семейства inet, который фактически может смешивать правила IPv4 и IPv6 (, для этого может потребоваться более новое ядро ​​в nat ), так что это упростит ситуацию.

0
12.07.2020, 14:36
1 ответ

Вы можете написать свою собственную программируемую функцию завершения для этих команд, назовем ее _cppи установим с помощью

complete -F _cpp vim vi nano nvim less cat more nl head tail

Я не пишу сейчас всю функцию, но вы должны генерировать (и отбрасывать )совпадения следующим образом:

files=( $(compgen -f hello_) )
COMPREPLY=()
for word in "${files[@]}"; do
    if [[ $word = *.cpp ]]; then
        COMPREPLY+=("$word")
    else
        if [[ ! -f "${word}.cpp" ]]; then
            COMPREPLY+=("$word")
        fi
    fi
done

Вместе с touch hello_world hello_world.cpp hello_world2это дает:

echo ${COMPREPLY[@]}
hello_world.cpp hello_world2
-1
18.03.2021, 23:20

Теги

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