【问题标题】:Perl: Testing that a file is actually writable as opposed to checking file permissionsPerl:测试文件实际上是可写的,而不是检查文件权限
【发布时间】:2021-05-11 16:13:39
【问题描述】:

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

在 Perl 中,我写了以下 sn-p:

#!/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 是否真的可写,而不是仅仅检查它的权限。

【问题讨论】:

  • 我没有任何系统可以故意将文件系统设置为只读,因此我无法对其进行测试。因此,问题是 -w 和 -W 是如何工作的。
  • 您可以尝试使用 cd 或 dvd。它们是只读文件系统。
  • 不幸的是,我在 Rackspace 托管的云服务器上编写此内容时,无法对服务器进行物理访问。也不是我的服务器,所以我没有 root。
  • 使用 linux,您可以轻松地创建一个文件系统并使用您想要的任何读/写或只读选项挂载它。您可以在物理 Linux 安装、VM 或租用的 VPS 上执行此操作。
  • 测试文件是否可写的最简单和最好的方法是使用写入或附加访问权限打开它并尝试写入。

标签: perl file-permissions


【解决方案1】:

一般来说,-X 操作符只测试文件模式,而不是文件是否真正可写。所以你将不得不测试实际执行的操作,并捕获任何失败。

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

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

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

你可以使用 touch 命令:

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

当使用 backtics 运行时,这将返回一个长度为零的字符串:

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

【讨论】:

  • 不也生成返回码吗?在我看来,这似乎是一个更好的测试。
【解决方案2】:

如果您关心的是文件系统,您可以检查它是否以只读方式挂载。如果是这样,它在/proc/mounts 中的行将包含ro,因此打开文件并在grep 中找到包含ro 的行和您的文件系统。

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

请注意,使用mount 进行查询不太可靠。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 抱歉,问题中已经解决了。我想知道 -w 函数是否真的会使用“>”运算符执行 open() 调用以测试文件是否可写,或者 -w 函数是否只是使用 stat() 检查文件的权限。
      • 它使用 stat 检查权限。 If you are using ACLs, there is a pragma called filetest that may produce more accurate results than the bare stat mode bits.
      猜你喜欢
      • 2012-08-22
      • 2012-04-25
      • 2016-01-06
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2015-03-07
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多