Forward remote address to local, DNAT just stuck

Когда вывод команды cal не является терминалом, она применяет подчеркивание бедняги к номеру дня на сегодня, который состоит из вставки символа подчеркивания и символа возврата перед каждым подчеркиваемым символом. Вы можете увидеть это, отобразив символы визуально ( ^ H означает control-H , который является символом возврата на место):

cal | cat -A
cal | cat -vet

или посмотрев на шестнадцатеричный дамп:

cal | hd
cal | od -t x1

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

С помощью GNU grep есть простой способ распечатать все совпадения регулярного выражения: использовать параметр -o . Символ подчеркивания соответствует расширенному регулярному выражению _ ^ H. где ^ H - буквальный символ возврата, а не два символа ^ и H и . - это символ для печати. Вместо того, чтобы вводить символ обратного пробела, вы можете полагаться на тот факт, что это единственный способ, которым cal использует подчеркивание в своем выводе. Так что достаточно обнаружить символы подчеркивания и оставить пробелы как несоответствующие символы.

cal | grep -o '_..'

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

cal | grep -o '_..' | tr -d 0-9; echo

В качестве альтернативы вы можете повторить шаблон _ .. , чтобы сопоставить несколько подчеркнутых цифр. Это оставляет подчеркивание в выводе, вы можете использовать tr или sed, чтобы убрать его.

cal | grep -E -o '(_..)*'
cal | grep -E -o '(_..)*' | tr -d '\b_'
cal | grep -E -o '(_..)*' | sed 's/_.//g'

Вы можете сделать это с помощью sed, но это не совсем просто. Sed предлагает простой способ распечатать только совпадающие строки (используйте параметр -n , чтобы получить только строки, которые печатаются явно), но нет прямого способа распечатать несколько совпадений в строке. Один из способов решить эту проблему - воспользоваться преимуществом того факта, что существует не более двух подчеркнутых символов и имеется одна команда s для преобразования и вывода строк, содержащих один подчеркнутый символ, и другой для строк с двумя. Как и раньше, я не буду явно сопоставлять пробелы.

cal | sed -n 's/.*_.\(.\)_.\(.\).*/\1\2/p; s/.*_.\(.\).*/\1/p'

Альтернативный подход к sed, предполагающий, что в строке есть только один подчеркнутый сегмент, заключается в удалении всего перед ним и всего после него.

cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/p'

Остались символы подчеркивания; мы можем удалить их с помощью третьей замены.

cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/; s/_.//gp'

1
22.01.2017, 15:46
1 ответ

Попробуйте

sysctl -w net.ipv4.conf.eth1.route_localnet=1

или

sysctl -w net.ipv4.conf.all.route_localnet=1

Возможно, вам придется дважды проверить, чтобы ядро ​​поддерживает route_localnet . Замените eth1 соответствующим образом.

Обратите внимание, что этот route_localnet отключен по соображениям безопасности.

3
27.01.2020, 23:34

Теги

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