звук колокола

Ubuntu 11.04 поддерживается до октября 2012 года. До тех пор вы продолжите получать обновления стабильности и безопасности. По истечении этого времени поддержка будет удалена, и, например, если обнаружены новые уязвимости безопасности, вы не будете закрыты. Это нормально, если вы остаетесь с 11.04 в течение периода поддержки, но после этого вы должны начать рассматривать обновление до более новой версии или переключать дистрибутивы / настольные среды, если к тому времени вы не сможете научиться настраиваться на Unity или GNOME Shell. [ ! d0]

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

2 ответа

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

0
ответ дан 18 July 2018 в 05:04

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

0
ответ дан 24 July 2018 в 18:14
  • 1
    Я не думаю, что это вызвано специальными символами, поскольку содержимое файла - это правила брандмауэра, есть только такие символы, как точка с запятой, одинарные / двойные кавычки, точки и т. Д. Кроме того, возможно, один из десяти запусков показывает непрерывное содержимое $ fw_orig и diff возвращает 'match'. Я предполагаю, что это имеет какое-то отношение к тому, сколько строк может показать терминал, или, может быть, что-то с файловыми дескрипторами и т. Д. Потому что, как я добавил позже, если я сначала сохраню свою переменную $ w_orig в файл, а позже буду использовать этот файл с diff команд, он всегда работает. поэтому содержание $ w_orig верное, только по какой-то причине не показало правду .. – mauek unak 20 October 2017 в 08:02
  • 2
    Ну, одинарные / двойные кавычки в файле могут вызвать очень серьезные проблемы из-за недостаточного экранирования, как я показал. При этом причина неправильного поведения может быть иная. Не могли бы вы придумать самодостаточный пример, воспроизводящий ошибку (то есть не используя файлы, содержимое которых нам неизвестно, а не ssh'ing и т. Д.)? Мне также непонятно , где точно сценарий переходит в haywire, сначала кажется, что это назначение fw_orig (первое утверждение в ssh), но позже вы экспериментируете с другими вариантами diff. – egmont 20 October 2017 в 12:24

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

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