Действительно ли возможно использовать, 'находят - должностное лицо sh-c' безопасно?

В основном это не имеет никакого бита контрольной суммы. Для идентификации опечатки Вы могли бы попытаться совместно использовать контрольную сумму (например, MD5) Вашей суммы MD5 по тому же каналу и проверить его.

31
17.09.2014, 13:08
1 ответ

Никогда не встраивайте {} в код оболочки! Это создает уязвимость инъекции команд. Обратите внимание, что для cat "{}" проблема не только в символах ", \, `, $ (рассмотрим, например, файл с именем ./$(перезагрузка)/accept_ra).

(кстати, некоторые реализации находят не позволяют этого сделать, а POSIX оставляет поведение неопределенным , когда {} не является само по себе аргументом для найти)

здесь, вы захотите передать имена файлов в качестве отдельных аргументов в sh (а не в аргументе code), а в строчном скрипте sh (в аргументе code), чтобы ссылаться на них с помощью параметров позиционирования:

find . -name accept_ra -exec sh -c 'echo 0 > "$1"' sh {} \;

Или, чтобы избежать выполнения одного sh в каждом файле:

find . -name accept_ra -exec sh -c 'for file do
  echo 0 > "$file"; done' sh {} +

То же самое относится к xargs -I{} или zsh's zargs -I{}. Не пишите:

 {}'

Что было бы такой же уязвимостью инъекции команд, как и в find выше, но:

<list.txt xargs sh -c 'for file do cmd > "$file"; done' sh

Что также имеет преимущество, так как позволяет избежать запуска по одному sh на файл и ошибки, когда list.txt не содержит ни одного файла.

С помощью zsh zargs вы, вероятно, захотите использовать функцию, а не вызывать sh -c:

do-it() cmd > $1
zargs ./*.txt -- do-it

Обратите внимание, что во всех вышеприведенных примерах второй sh идет в строчный скрипт $0. Вы должны использовать там что-то соответствующее (например, sh или find-sh), а не такие вещи, как _, -, -- или пустую строку, так как значение в $0 используется для сообщений об ошибках в оболочке оболочки:

$ find . -name accept_ra -exec sh -c 'echo 0 > "$1"' inline-sh {} \;
inline-sh: ./accept_ra: Permission denied

GNU parallel работает по-другому. С ним вы делаете , а не , чтобы использовать sh -c, так как parallel уже запускает оболочку и пытается заменить {} на аргумент, процитированный в правом синтаксисе для оболочки.

<list.txt PARALLEL_SHELL=sh parallel 'cmd > {}'
41
27.01.2020, 19:38

Теги

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