Вставить последний аргумент в bash в режиме vi без вставки начального пробела

Маршрутизация осуществляется на уровне IP 3. TCP — на уровне 4, поэтому одной маршрутизации недостаточно для решения этой проблемы.

Короче говоря, :интересующий трафик должен быть помечен iptables, а помеченные пакеты выбраны с помощьюip ruleс fwmarkдля использования отдельной таблицы маршрутизации. Затем необходимо применить еще два исправления для случая локально инициированного/полученного трафика, что сложнее, чем случай с маршрутизацией. Все настройки, разумеется, выполняются в локальной системе.

Таблица маршрутизации80(соответствующее символическое имя может быть добавлено в /etc/iproute2/rt_tables, но это не обязательно )и метка 0x80была выбрана "произвольно".

ip route add table 80 192.168.1.0/24 dev eth0 scope link src 192.168.1.56
ip route add table 80 default dev eth0 via 192.168.1.1

Использование -I, чтобы правила iptables не добавлялись слишком поздно. Вы должны проверить свои текущие правила, как изменить порядок, если это необходимо:

iptables -t mangle -N markports
iptables -t mangle -I PREROUTING 1 -j CONNMARK --restore-mark
iptables -t mangle -I OUTPUT 1 -m mark --mark 0 -j markports
iptables -t mangle -I OUTPUT 2 -j CONNMARK --save-mark
iptables -t mangle -A markports -p tcp --dport 80 -j MARK --set-mark 0x80
iptables -t mangle -A markports -p tcp --dport 443 -j MARK --set-mark 0x80

ip rule add fwmark 0x80 lookup 80

Этот блог:Netfilter Connmark » В Linux и дальше! дает хорошую информацию о CONNMARK.

Это должно было работать, но на самом деле при первом решении о маршрутизации был выбран неправильный исходящий IP-адрес по умолчанию, потому что маршрут должен был проходить через tun0. При проверке перенаправления, выполненной из-за метки mangle/OUTPUT(, см. этот Поток пакетов в схеме Netfilter and General Networking для разъяснения ), этот IP-адрес не изменится. Если бы обрабатываемый трафик маршрутизировался, а не инициировался локально, эта проблема не возникла бы (с использованием отдельного сетевого пространства имен, чтобы убедиться, что это решение для служб, а не для рабочего стола ). Так что это требует также слояMASQUERADE(или SNATдля более сложных случаев )поверх него:

iptables -t nat -I POSTROUTING 1 -m mark --mark 0x80 -j MASQUERADE

Теперь, когда исходящий IP-адрес правильный, он по-прежнему не работает :фильтр обратного пути срабатывает на обратном пути примерно по той же причине, :решение о маршрутизации, принятое ранее PREROUTINGпока не знает fwmark(, несмотря на предыдущую схему , помещающую mangle/PREROUTINGперед решением о маршрутизации,очевидно, это не так ), поэтому считает пакеты обратного трафика поддельными и отбрасывает их раньше. Интерфейс eth0rp_filterдолжен быть переведен в свободный режим, чтобы это было разрешено. Это может иметь некоторые (очень незначительные проблемы с безопасностью за NAT ), но я считаю это неизбежным для этого случая без -маршрутизации:

echo 2 > /proc/sys/net/ipv4/conf/eth0/rp_filter

Вам придется найти, как установить его на постоянной основе (например, echo net.ipv4.conf.eth0.rp_filter=2 > /etc/sysctl.d/90-local-loose-mode.conf, если ничего больше не изменит его позже ).

Протестировано нормально при использовании пространств имен с настройками, аналогичными параметрам операционной системы.

ПРИМЕЧАНИЕ. :DNS-запросы по-прежнему будут проходить через туннель. Некоторые геолокализованные веб-сервисы могут работать не так, как ожидалось.

7
05.08.2020, 10:59
1 ответ

Это действительно похоже на ошибку, но на самом деле Bash просто пытается следовать указанному в POSIX поведению _,

[count]_
Append a <space> after the current character position and then append the last bigword in the previous input line after the <space>. Then enter insert mode after the last character just appended. With a number count, append the countth bigword in the previous line.

В качестве обходного пути добавьте это в свой ~/.inputrc. Вы можете изменить \M-hна любой другой несвязанный ключ, если хотите.

set editing-mode vi
set keymap vi-command
"\M-h":history-expand-line
".":"a!$\e\M-hA"

Теперь откройте новый терминал. После удара . в обычном режиме,

  • !$вставляется в командную строку -.
  • \e(означает, что Esc)возвращается в нормальный режим.
  • \M-hзапускает действие history-expand-line, которое расширяет $!до значения последнего аргумента.
  • Aперемещается в конец -строки -и переходит в режим вставки.
$ echo "X Y Z"
X Y Z
$ "X Y Z" #<ESC>. inserts this
$ echo "X Y Z"
X Y Z
$ cat "X Y Z" #cat <ESC>. inserts this
2
18.03.2021, 23:14

Теги

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