Ubuntu 11.04 поддерживается до октября 2012 года. До тех пор вы продолжите получать обновления стабильности и безопасности. По истечении этого времени поддержка будет удалена, и, например, если обнаружены новые уязвимости безопасности, вы не будете закрыты. Это нормально, если вы остаетесь с 11.04 в течение периода поддержки, но после этого вы должны начать рассматривать обновление до более новой версии или переключать дистрибутивы / настольные среды, если к тому времени вы не сможете научиться настраиваться на Unity или GNOME Shell. [ ! d0]
Давайте упростим пример, сосредоточившись только на неисправной строке и некоторых ее предпосылках, и устраним ненужные шаги (например, ssh).
Переменная fw_loc содержит содержимое файла. У него наверняка много вершин и много мест; предположительно, другие специальные символы.
Если я не вижу содержимого этого файла, я стараюсь быть злым. Итак, вот урезанная версия того, что вы делаете, с каким-то мнимым злым содержанием из этого файла:
fw_loc='foo"; rm -rf "/ouch'
cat <<ABC
fw_orig="$fw_loc"
ABC
Если вы выполните это, вы увидите, что это печатает
fw_orig="foo"; rm -rf "/ouch"
В вашем конкретном случае это не cat ed, но отправлено на удаленный хост для выполнения.
Уровень экранирования явно недостаточен. Я полагаю, что это причина странного поведения, которое вы испытываете, хотя я не уверен, какие специальные символы он терпит неудачу в вашем случае.
Один из возможных подходов состоит в том, чтобы избежать значения, чтобы следующий assigmnent в bash (на удаленной стороне) будет работать правильно, используя 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, возможно, даже на локальный хост и выполните локальное сравнение.
Давайте упростим пример, сосредоточившись только на неисправной строке и некоторых ее предпосылках, и устраним ненужные шаги (например, ssh).
Переменная fw_loc содержит содержимое файла. У него наверняка много вершин и много мест; предположительно, другие специальные символы.
Если я не вижу содержимого этого файла, я стараюсь быть злым. Итак, вот урезанная версия того, что вы делаете, с каким-то мнимым злым содержанием из этого файла:
fw_loc='foo"; rm -rf "/ouch'
cat <<ABC
fw_orig="$fw_loc"
ABC
Если вы выполните это, вы увидите, что это печатает
fw_orig="foo"; rm -rf "/ouch"
В вашем конкретном случае это не cat ed, но отправлено на удаленный хост для выполнения.
Уровень экранирования явно недостаточен. Я полагаю, что это причина странного поведения, которое вы испытываете, хотя я не уверен, какие специальные символы он терпит неудачу в вашем случае.
Один из возможных подходов состоит в том, чтобы избежать значения, чтобы следующий assigmnent в bash (на удаленной стороне) будет работать правильно, используя 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, возможно, даже на локальный хост и выполните локальное сравнение.