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