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
возможно, это может помочь понять то, что продолжается.. однако, файл <> переменные работы сравнения, переменная <> переменное сравнение не работает..
Давайте упростим пример, фокусируясь только на поврежденной линии и некоторые ее предпосылки, и устраним ненужные шаги (такие как 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 и делают сравнение локально.