假设我有一个文件/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 是否确实可写,而不是仅仅检查其权限。
一般来说,-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";
}
如果您关心的是文件系统,您可以检查它是否以只读方式挂载。如果是这样,则
/proc/mounts
中的行将具有 ro
,因此打开文件并打开 grep
以查找包含 ro
和您的文件系统的行。
这只适用于使用
/proc
但你的文件系统。
请注意,使用
mount
查询不太可靠。
一个可靠的方法是尝试写入一个文件,我会使用 File::Temp 来实现。
与 perl 相比,bash/sh shell test -w 命令会检查文件系统挂载,因此您可以使用它,例如
perl -e 'if (`[ -w . ] || echo NO`) {print "unwritable\n"}'
是的。您也可以执行如下操作:
if (-r $file && -w $file) {
# file exists, I can read and write it
}