терминальное прерывание звука звонка

loc="locationA"
usr="user1"
fw_loc=$(</home/user/Desktop/FW_RULES.txt)

ssh -A -tt user2@192.168.1.2 <<ABC
fw_orig="$fw_loc"
fw_cmpr=\$(ssh root@$loc -o LogLevel=ERROR uci show firewall)
wc --lines <<<"\$fw_orig"
wc --lines <<<"\$fw_cmpr"
diff -s <(echo "\$fw_orig") <(echo "\$fw_cmpr")
exit
ABC

У меня есть сценарий, где я загружаю локальный текстовый файл в переменную в ЗДЕСЬ документе. Текстовый файл имеет приблизительно 370 строк. Затем я беру правила брандмауэра с другого сервера и пытаюсь выдержать сравнение, если FW управляет соответствием. Однако после того, как строка fw_orig =" $fw_loc" оболочка автоматически разворачивает переменную (не на самом деле необходимый, хотя), и терминал заставляет звуковой сигнал звучать и делает прерывания в тексте, как так:

[user2@jump ~]$ fw_orig="firewall.defaults=defaults
>firewall.poplanhttp3=rule
l
> firewall.poplanhttp3.name='poplanhttp3'
> firewall.lanpopchhttp2.name='lanpopahttp5'
> firewal
> firewall.lanpopchhttp2.dest='POPA'
.
firewall.poplanssh2.dest_port='27'
i
> firewall.poplanssh2.target='ACCEPT'
/

текст прерван в различных строках каждый раз, когда я выполняю его. почему делают те прерывания со звуком происходят и как я могу избежать его? Интересный это, что позже в моем сценарии я сравниваю обе переменные и количество соответствий строк, но различная команда находит различия между переменными во всех прерываниях "$fw_orig".

ОТРЕДАКТИРУЙТЕ, когда я пытался записать переменную в файл и затем сравнить его:

echo "\$fw_orig">/home/user2/file
..
..
diff -s <(echo "\$fw_orig") /home/user2/file

команда dif возвращается:

Files /dev/fd/63 and /home/user2/file are identical

возможно, это может помочь понять то, что продолжается.. однако, файл <> переменные работы сравнения, переменная <> переменное сравнение не работает..

1
задан 19 October 2017 в 11:51

1 ответ

Давайте упростим пример, фокусируясь только на поврежденной линии и некоторые ее предпосылки, и устраним ненужные шаги (такие как ssh).

fw_loc переменная содержит содержание файла. Это уверенный имеет много новых строк и много пробелов; по-видимому, другие специальные символы также.

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

fw_loc='foo"; rm -rf "/ouch'

cat <<ABC
fw_orig="$fw_loc"
ABC

При выполнении этого Вы будете видеть, что это печатает

fw_orig="foo"; rm -rf "/ouch"

В Вашем особом случае это не catредактор, но отправленный в удаленный хост для выполнения.

Уровень выхода ясно не достаточен. Я полагаю, что это - причина странного поведения, которое Вы испытываете, хотя я не уверен, на каких специальных символах это перестало работать в Вашем случае.

Один возможный подход должен выйти из значения так, чтобы последующее присвоение в ударе (на удаленной стороне) работало правильно с помощью printf %q:

fw_loc='foo"; rm -rf "/ouch'

cat <<ABC
fw_orig=$(printf %q "$fw_loc")
ABC

Заботьтесь для использования двойных кавычек сразу вокруг ссылки на переменную $fw_loc (иначе printf не делает его задания правильно), но не вокруг $(...) замена команды (потому что printf %q полагается на его вывод, не являющийся в кавычках)!

Это печатает

fw_orig=foo\"\;\ rm\ -rf\ \"/ouch

который эквивалентен fw_locопределение выше.

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

Альтернативное решение могло бы состоять в том, чтобы разделить эту сложную логику вниз к меньшим шагам, например, передать использование файла scp, возможно, даже к localhost и делают сравнение локально.

0
ответ дан 8 December 2019 в 03:45

Другие вопросы по тегам:

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