Вы можете запустить не ту программу. Кто-то может заставить вас запустить их программу.
-execdir
Действие запускает вашу команду из каталога , который содержит файл (ы). Когда $PATH
содержит относительные пути, такие как .
или что-либо, с чего не начинается/
, -execdir
небезопасно, потому что каталог, в котором находится файл (или другой каталог, разрешенный относительно него), также может содержать исполняемый файл с тем же именем, что и тот, который вы пытаетесь бежать. Этот потенциально ненадежный исполняемый файл затем будет запущен.
Это может быть намеренно использовано другим пользователем, чтобы заставить вас запустить его программу, которая может нанести вред или нарушить безопасность данных, вместо программы, которую вы пытаетесь запустить. Или, реже, это может привести к непреднамеренному запуску неправильной программы, даже если никто не попытается решить проблему.
Если все в вашей PATH
переменной окружения это абсолютный путь, эта ошибка не должна возникать, даже если каталог , который вы ищете , и -execdir
ИНГ от это содержится в PATH
. (Я проверил, что это работает.) Если вы считаете, что у вас нет относительных каталогов, $PATH
но вы все еще получаете эту ошибку, пожалуйста, обновите ваш вопрос с подробностями, включая вывод echo "$PATH"
.
Конкретный пример.
В качестве примера того, что может пойти не так, предположим:
- У Алисы есть
.
она, $PATH
потому что она хочет иметь возможность запускать программы в любом каталоге, к которому она хочет cd
, не удосуживаясь добавить их имена ./
.
- Ева в ярости Ева поделилась
/home/eve/shared
с Алисой.
- Алиса хочет получить статистику (строки, слова, байты) в
.c
файлах, которыми Ева поделилась с ней.
Итак, Алиса бежит:
find ~eve/shared -name \*.c -execdir wc {} \;
К сожалению для Алисы, Ева создала свой собственный сценарий, назвал его wc
, установил его executeable ( chmod +x
) и тайно поместил в один из каталогов /home/eve/shared
. Сценарий Евы выглядит так:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Поэтому, когда Алиса использует find
с -execdir
для запуска wc
файлов, которыми поделилась Ева, и попадает в файлы в том же каталоге, что и пользовательский wc
сценарий Евы, Ева wc
запускается - со всеми привилегиями Алисы!
(Будучи хитрой, Ева заставила свой wc
сценарий действовать как обертка для системы wc
, поэтому Алиса даже не узнает, что что-то пошло не так, т. Е. Что это do_evil
было выполнено. Однако возможны более простые - и более сложные - варианты. )
Как find
это мешает.
find
предотвращает возникновение этой проблемы с безопасностью , отказываясь выполнять -execdir
действие, если он $PATH
содержит относительный каталог.
find
предлагает два диагностических сообщения в зависимости от конкретной ситуации.
Если .
он включен $PATH
, то (как вы видели) он говорит:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
Это, вероятно, имеет специальное сообщение для .
случая, поскольку это особенно распространено.
Если относительный путь, кроме .
--say, foo
--appears в $PATH
и вы бежите find
с -execdir
, он говорит:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
Лучше вообще не иметь относительных путей $PATH
.
Риск наличия .
или других относительных путей $PATH
особенно повышается при использовании утилиты, которая автоматически меняет каталог, поэтому find
не позволяет использовать ее -execdir
в этой ситуации.
Но наличие относительных путей, особенно .
в вашем, по своей $PATH
сути рискованно и действительно лучше избегать в любом случае. Рассмотрим вымышленную ситуацию в примере выше. Предположим , что вместо того, чтобы бежать find
, Алиса просто cd
с до ~eve/shared/blah
и работает wc *.c
. Если blah
содержит wc
сценарий Евы , do_evil
запускается как Алиса.
Существует гораздо более подробная информация здесь . Еще одна отличная ссылка здесь . Цитировать из первой ссылки:
Из второй ссылки:
источник
Основная проблема заключается в значении системной переменной,
PATH
которая содержит относительные папки в ней, поэтому по соображениям безопасностиfind
команда не позволит вам запускать двоичные файлы, потому что потенциально она может выполнять неправильные программы.Так, например, если у вас есть текущая директория в вашей переменной PATH согласно предупреждению, которое вы получаете:
и вы запустите свою команду:
в случае, если у вас будет локальный скрипт (
rm
с исполняемыми флагами)rm -fr /
, он может удалить все ваши файлы, потому что вместо ожидаемого/bin/rm
вы будете выполнятьсяrm
из текущего каталога, поэтому, вероятно, это не то, что вы хотели.В качестве примечания, это известная проблема в Travis CI ( GH # 2811 ), когда происходит сбой с ошибкой:
Таким образом, решение состоит в том, чтобы удалить затронутую запись из переменной PATH, например
как предложил Дрогус . Прогресс этой ошибки, можно следить на GH # 4862 .
Вот обходное решение Bash версии:
Пример использования (передача отфильтрованной
PATH
определенной команде):источник
sed
что, кажется, удаляет все, чтоfind
не нравится: askubuntu.com/questions/621132/…xargs
иbash -c cd
обходной путьХорошо, я сдаюсь
sed
обходной путьНемного менее приятно, чем предыдущий обходной путь:
Тестовый пример:
В
rename
частности, вы также можете обойти некоторые регулярные выражения Perl: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971RTFS надеюсь, сокрушительный
Для тех, у кого есть надежда на то, что существует способ игнорировать
find
самоуверенность, позвольте мне опустить это с некоторым источником:Из этого мы видим, что, похоже, нет способа отключить проверку пути.
Точное правило, которое он проверяет: сбой, если
PATH
либо пусто, либо не начинается с/
.источник