Это зависит от того, что вы подразумеваете под безопасностью. Если место на диске, где хранится ваша программа, недоступно для записи другими пользователями, это безопасно в том смысле, что это просто еще один ПУТЬ, который пользователи не могут использовать, обманывая ваше программное обеспечение, чтобы запустить что-то еще.
Это небезопасно в том смысле, что копирование двоичных файлов в каталог с программным обеспечением непереносимо и не требует исправлений безопасности. Но если вы понимаете свое собственное развертывание, это может не быть проблемой.
Проблема не в find
, а в том, как вы создаете этот каталог. Строка 'foo\n'
в одинарных кавычках на самом деле представляет собой строку из 5 -символов, последние два из которых — обратная косая черта и строчная буква «n».
Двойное -цитирование тоже не помогает, так как строки в двойных -кавычках в оболочке используют обратную косую черту в качестве escape-символа, но на самом деле не интерпретируют ни одну из последовательностей обратной косой черты в стиле C -.
В оболочке, такой как bash или zsh и т. д. (, но не в dash из Debian/Ubuntu ), вы можете использовать $'...'
, которая интерпретирует эти последовательности:
$ mkdir $'foo\n'
(См. документацию bash для этой функции, называемой "ANSI C Quoting" ).
Другой вариант, который должен работать в любой оболочке, совместимой с оболочкой Bourne, заключается в вставке реальной новой строки:
$ mkdir 'foo
'
Фактически это Возврат в конце первой строки, закрывая только одинарную кавычку во второй строке.
Давайте создадим каталог с именем foo
плюс новую строку:
$ mkdir $'foo\n'
Теперь воспользуемся функцией find:
$ find. -print0 | od -c
0000000 . \0 . / f o o \n \0
0000011
\n
не экранируется.
Проблема в том, что mkdir 'foo\n'
— это имя, которое интерпретируется как foo
, за которым следует \
, за которым следует n
. Мы можем убедиться, что с помощью:
$ printf '%s' 'foo\n' | od -c
0000000 f o o \ n
0000005