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

时间:2016-12-25 22:29:12

标签: perl file-permissions

假设我有一个文件/ 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是否实际上可写,而不是仅检查其权限。

4 个答案:

答案 0 :(得分:3)

通常,-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";
}

答案 1 :(得分:3)

如果您关心的是文件系统,则可以检查它是否以只读方式挂载。如果是这样,其/proc/mounts中的行将ro,因此请打开文件,grep表示ro行和您的文件系统。

这仅适用于使用/proc的文件系统但您的文件系统。

请注意,使用mount查询的可靠性较低。

一种可靠的方法是尝试编写文件,我会使用File::Temp

答案 2 :(得分:0)

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

if (-r $file && -w $file) {
    # file exists, I can read and write it
}

答案 3 :(得分:0)

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

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