Spec-Zone.ru › Perl 5.28

filetest

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
    • Внимательно рассмотрите это
    • Под-псевдоним «access»
    • Ограничения в отношении _

ИМЯ

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–2020 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.28.3/filetest

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API