filetest
СОДЕРЖАНИЕ
ИМЯ
filetest - Perl-псевдоним для управления операторами проверки файла
СИНТАКСИС
$can_perhaps_read = -r "file"; # use the mode bits
{
use filetest 'access'; # intuit harder
$can_really_read = -r "file";
}
$can_perhaps_read = -r "file"; # use the mode bits again ОПИСАНИЕ
Этот псевдоним сообщает компилятору изменить поведение операторов проверки файла, -r -w -x -R -W -X (см. perlfunc).
По умолчанию операторы проверки файла используют простые биты режима, возвращаемые семейством системных вызовов stat(). Однако многие операционные системы имеют дополнительные возможности для определения более сложных прав доступа, например, списки управления доступом (ACL). В таких средах use filetest может помочь операторам проверки файла возвращать результаты, более согласованные с другими инструментами.
Заявления use filetest или no filetest влияют на проверки файлов, определенные в их блоке, до конца ближайшего вложенного блока (они имеют область действия блока).
В настоящее время реализован только под-псевдоним access. Он включает (или отключает) использование access(), если оно доступно, то есть в большинстве UNIX-систем и других средах POSIX. Смотрите подробности ниже.
Внимательно рассмотрите это
Биты режима stat() вероятно, подходят для большинства файлов и каталогов в вашей системе, потому что мало кто хочет использовать дополнительные возможности, предоставляемые access(). Но вы можете столкнуться с неожиданными результатами, если ваша программа выполняется на системе, использующей ACL, поскольку информация stat() не отразит фактические разрешения.
Операции проверки файла могут быть немного медленнее, когда псевдоним filetest активен, потому что проверка битов очень быстрая.
Также обратите внимание, что использование проверок файлов в целях безопасности - это безнадежное занятие с самого начала: существует окно для гонок (кто может сказать, что разрешения не изменятся между проверкой и реальной операцией?). Поэтому, если вы серьезно относитесь к безопасности, просто попробуйте реальную операцию и проверьте её успешность - думайте в терминах атомарных операций. Проверки файлов более полезны для административных задач файловой системы, когда вам не нужно содержимое элементов на диске.
Под-псевдоним "access"
UNIX- и POSIX-системы предоставляют абстрактный системный вызов access(), который должен использоваться для запроса прав чтения, записи и выполнения. Эта функция скрывает различные подходы в дополнительных операционных системах, специфичных для безопасности, таких как списки управления доступом (ACL).
Расширенная функциональность проверки файла используется Perl только тогда, когда аргументом операторов является имя файла, а не дескриптор файла.
Ограничение относительно _
Поскольку access() не вызывает stat() (по крайней мере, не так, как это видно Perl), кеш результатов stat "_" не устанавливается. Это означает, что результат следующих двух проверок отличается. В первом случае биты stat для /etc/passwd в _, а во втором случае они всё ещё содержат биты /etc.
{ -d '/etc';
-w '/etc/passwd';
print -f _ ? 'Yes' : 'No'; # Yes
}
{ use filetest 'access';
-d '/etc';
-w '/etc/passwd';
print -f _ ? 'Yes' : 'No'; # No
} Конечно, если ваша ОС не реализует access(), в этом случае псевдоним просто игнорируется. Лучше вообще не использовать _ в файле, где активен псевдоним filetest!
В качестве побочного эффекта, так как _ не работает, сложенные операторы проверки файлов (-f -w $file) тоже не будут работать.
Это ограничение может быть устранено в будущих версиях Perl.
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/filetest