З посібника з findutils:
Наприклад такі конструкції, як ці дві команди
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;дуже небезпечні. Причиною цього є те, що "{}" розширено на ім'я файлу, яке може містити крапку з комою або інші символи, спеціальні для оболонки. Якщо, наприклад, хтось створює файл,
/tmp/foo; rm -rf $HOMEто дві вищевказані команди можуть видалити чиїсь домашні каталоги.Тому з цієї причини не запускайте жодної команди, яка передасть недовірені дані (наприклад, імена fi les) командам, які інтерпретують аргументи як команди, які слід далі інтерпретувати (наприклад, "sh").
Що стосується оболонки, то для цієї проблеми є розумне рішення:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;Цей підхід не гарантується, щоб уникнути кожної проблеми, але він набагато безпечніший, ніж заміщення даних вибору зловмисника в текст команди оболонки.
- Чи є причиною проблеми в
find -exec sh -c "something {}" \;тому, що заміна на{}не цитується і тому не трактується як одна рядок? У рішенні
find -exec sh -c 'something "$@"' sh {} \;,спочатку
{}замінюється, але оскільки{}це не цитується, чи не"$@"виникає така ж проблема, як оригінальна команда? Наприклад,"$@"буде розширена"/tmp/foo;","rm","-rf"і"$HOME"?чому
{}не уникнути і не цитувати?
- Чи можете ви навести інші приклади (як і раніше
sh -c, або без цього, якщо це застосовується; з чи безfindцього, можливо, не потрібно), коли застосовуються однакові проблеми та рішення, і які є мінімальними прикладами, щоб ми могли зосередити увагу на проблемі та вирішенні якомога менше відволікання? Див. Розділи Способи надання аргументів команді, виконаній `bash -c`
Спасибі.