Как передать вывод sed в printf для форматирования?

Ваша проблема заключается в том, что TCP-пакеты, отправляемые вашим сервером, используют другой путь, чем TCP-пакеты, которые вы отправляете на него, и тогда ваш pfsense считает, что соединение не установлено, и удаляет его из своей таблицы установленных соединений, впоследствии отклоняя все входящие пакеты.

TCP-пакеты, идущие с вашего компьютера в пользовательской сети на ваш сервер, отправляются на маршрутизатор pfsense, который перенаправляет их на ваш ssh-сервер. Поскольку ваш ssh-сервер имеет интерфейс в вашей пользовательской сети, обратные пакеты отправляются непосредственно на ваш компьютер через его интерфейс в пользовательской сети. Следовательно, pfsense видит только пакеты, идущие с вашего компьютера на сервер, и, поскольку первые кадры TCP SYN не были подтверждены, он решает, что соединение разорвано через некоторое время, и отбрасывает последующие пакеты.

Быстрым обходным решением для pfsense может быть SNAT-пакеты ssh, идущие из сети пользователя в сеть администратора. Таким образом, сервер ssh будет использовать pfsense для своего обратного пути. Тогда сервер ssh, конечно, не сможет узнать фактический исходный адрес.

Лучшим подходом является использование маршрутизации на основе источника. См., например, этот вопрос .

0
28.10.2019, 22:57
2 ответа

Попробуйте заключить команду printfв двойные кавычки. С синтаксисом подстановки команд $(…)и добавлением одинарных кавычек к вашим командам sedэто будет:

sed 's/XYZXYZXYZ/'"$(printf ' "%s" ' $(sed -n '1,265p' Run-0020))"/../../wt/wt-layout_A.dat

Вероятно, вы можете удалить первый символ пробела в команде printf, заменив его на printf '"%s" '.

0
28.01.2020, 03:10

Ваша проблема в том, что вы пытаетесь заменить строку многострочным -выводом в sed. Строка замены не может содержать символы новой строки. Их нужно кодировать как\n

Одним из обходных путей может быть кодирование новых строк в вашей замещающей строке с необычным символом, а затем их повторное декодирование. -Между ними просто добавьте кавычки, где это необходимо:

 sed \
   #replace newlines in input with END OF TEXT byte as separator
   #not using NUL byte as many shells ignore them
   #ignore newline on last entry
   -e "s/XXX/$(sed -n 1,265p RUNFILE | tr '\n' '\03' | sed 's/\x03$//' )" \
   #replace new separator by "<separator>", as well addin " at beginning and end of line
   -e 's/\x03/"\0"/g;s/^/"/;s/$/"/'
   #reintroduce newlines
   -e 's/\x03/\n/g' LAYOUTFILE > OUTPUT

Образец ввода

$cat LAYOUTFILE
XXX

$cat RUNFILE
1
....
300

$cat OUTPUT
"1"
....
"265"

PS :игнорируя использование printf, поскольку все, что вам нужно, это заключать строки в двойные кавычки.

0
28.01.2020, 03:10

Теги

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