Perl:测试文件是否实际上可写,而不是检查文件权限

问题描述 投票:0回答:4

假设我有一个文件/var/tmp/filename

在 Perl 中,我编写了以下代码片段:

#!/usr/bin/env perl
use strict;
use warnings;

if (-W /var/tmp/filename)
{
...
}

exit;

-W 和 -w 函数(http://perldoc.perl.org/functions/-X.html)会检查文件是否确实可以写入,还是仅检查文件权限是否允许写入?

我问的原因是我正在编写一个检索 cookie 的脚本。

此脚本需要能够将 cookie 文件写入文件系统,但如果 cookie 文件的文件系统路径是只读的,则文件的权限并不重要。所以我想测试 cookiefile 是否确实可写,而不是仅仅检查其权限。

perl file-permissions
4个回答
4
投票

一般来说,-X 运算符仅测试文件模式,而不测试文件是否真正可写。因此,您必须测试实际执行的操作,并捕获任何失败。

来自 http://perldoc.perl.org/functions/-X.html :

默认情况下,文件权限运算符 -r 、 -R 、 -w 、 -W 、 -x 和 -X 的解释仅基于文件的模式以及用户的 uids 和 gids 。可能还有其他原因导致您无法实际读取、写入或执行该文件:例如网络文件系统访问控制、ACL(访问控制列表)、只读文件系统和无法识别的可执行格式。请注意,使用这六个特定运算符来验证某些操作是否可能通常是错误的,因为它可能会受到竞争条件的影响。

我刚刚在我的测试系统(Ubuntu 16.04)上使用文件系统中的文件系统的只读环回挂载验证了这一点,并且 -W 标志确实错误地报告该文件可以写入。

您可以使用触摸命令:

$ touch /media/MountPoint/testfile
touch: cannot touch '/media/MountPoint/testfile': Read-only file system

使用 backtics 运行时,成功时将返回零长度字符串:

unless (length `touch $filename`) 
{
    print "Can write\n";
}

3
投票

如果您关心的是文件系统,您可以检查它是否以只读方式挂载。如果是这样,则

/proc/mounts
中的行将具有
ro
,因此打开文件并打开
grep
以查找包含
ro
和您的文件系统的行。

这只适用于使用

/proc
但你的文件系统。

请注意,使用

mount
查询不太可靠。

一个可靠的方法是尝试写入一个文件,我会使用 File::Temp 来实现。


0
投票

与 perl 相比,bash/sh shell test -w 命令会检查文件系统挂载,因此您可以使用它,例如

perl -e 'if (`[ -w . ] || echo NO`) {print "unwritable\n"}'

-1
投票

是的。您也可以执行如下操作:

if (-r $file && -w $file) {
    # file exists, I can read and write it
}
© www.soinside.com 2019 - 2024. All rights reserved.