Linux-шлюз с одним интерфейсом и псевдонимами

В bash3.2 или выше и если совместимость с 3.1 не включена (с опцией compat31или BASH_COMPAT=3.1), цитирование операторов регулярных выражений (не только с \, но и с любым из операторы bashв кавычках ('...', "...", $'...',$"..."))лишают их особого смысла.

[[ $var =~ 'OK$' ]]

соответствует только в строках, содержащих OK$буквально (, где $соответствует литералу$)

[[ $var =~ OK$ ]]

соответствует строкам, которые заканчиваются на OK(, что $является оператором RE, который соответствует в конце строки ).

Это также относится к регулярным выражениям, хранящимся в переменных, или к результату некоторой замены.

[[ $var =~ $regexp ]]   # $var matches $regexp
[[ $var =~ "$string" ]] # $var contains $string

Обратите внимание, что это может стать неудобным, поскольку есть некоторые символы, которые необходимо заключать в кавычки для синтаксиса оболочки (, например пробелы, <, >, &, круглые скобки, если они не совпадают ). Например, если вы хотите сопоставить с .{3} <> [)}]&regexp (3 символа, за которыми следует " <> ", )или }и &), вам нужно что-то вроде:

[[ $var =~.{3}" <> "[}\)]\& ]]

Если вы сомневаетесь, какие символы нужно заключать в кавычки, вы всегда можете использовать временную переменную . Это также означает, что он сделает код совместимым с bash31, zshили ksh93:

.

pattern='.{3} <> [})]&'
[[ $var =~ $pattern ]] # remember *not* to quote $pattern here

Это также единственный способ, (кроме использования compat31опции (или BASH_COMPAT=3.1)), вы можете использовать не -расширенные операторы POSIX регулярных выражений вашей системы.

Например, чтобы \<считалось границей слова, как во многих механизмах регулярных выражений, вам нужно:

pattern='\'
[[ $var =~ $pattern ]]

Делать:

[[ $var =~ \ ]]

не будет работать, так как bashобрабатывает эти \как операторы кавычек оболочки и удаляет их перед передачей в библиотеку регулярных выражений.

Обратите внимание, что в ksh93 все гораздо хуже,:

[[ $var =~ "x.*$" ]]

Например,

будет соответствовать whatever-xa*, но не whatever-xfoo. Цитата выше лишает *особого смысла, но не .и не $.

zshповедение проще :кавычки не меняют значения операторов регулярных выражений (как в bash31 )что делает поведение более предсказуемым (вместо этого можно использовать регулярные выражения PCRE ЭРЭ (сset -o rematchpcre)).

yashне имеет конструкции [[...]], но встроенная функция [имеет оператор =~(также вzsh). И, конечно же, [является обычной командой, поэтому заключение в кавычки не может повлиять на интерпретацию операторов регулярных выражений.


Также обратите внимание, что, строго говоря, ваш $sсодержит не 3 строки, а 2 полные строки, за которыми следует бесконечная строка. Он содержит hello\nworld\nOK. В расширенном регулярном выражении OK$оператор $будет соответствовать только концу строки .

В 3 -полных -строках строка , например hello\nworld\nOK\n(, которую вы не сможете получить с помощью подстановки команд в виде полос подстановки команд все в конце символов новой строки ), $будет соответствовать после \n, поэтому OK$не будет соответствовать на нем.

Однако с zsh -o pcrematch$соответствует как в конце строки, так и перед новой строкой в ​​конце строки, если она есть, поскольку она не передает флаг PCRE_DOLLAR_ENDONLYв pcre_compile. Это может показаться плохой идеей, поскольку обычно переменные в оболочках не содержат завершающий символ новой строки, и когда они это делают, мы обычно хотим, чтобы они рассматривались как данные .

0
01.08.2019, 12:40
2 ответа

Вам может понадобиться SNAT (Source NAT )ваша внутренняя сеть:

-A POSTROUTING -o eth0 -j eth0_masq
-A eth0_masq -s 192.168.158.203/17 -j SNAT --to-source 172.105.89.xxx/24

Где «.89.xxx» — общедоступный IP-адрес, который вы хотели бы использовать из своего диапазона общедоступных IP-адресов для исходящих подключений.

0
28.01.2020, 03:24

В конце концов я обнаружил, что моя конфигурация в порядке.

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

0
28.01.2020, 03:24

Теги

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