为什么文件测试操作符不工作(Perl)?

为什么文件测试操作符不工作(Perl)?,perl,unix,access-rights,Perl,Unix,Access Rights,在“编程Perl”-w中,文件测试操作符描述为: –w文件可通过有效的UID/GID写入 我有两个文件: -rwsrwxrwx 1 testuser testuser 226 Jul 20 20:31 script.pl -rw-rw-r-- 1 testuser testuser 34 Jul 14 17:24 file.txt suid设置在script.pl上,所以当我以用户caligula的身份运行它时,有效的UID/GID应该是testuser的UID/GIDscript.pl是:

在“编程Perl”
-w
中,文件测试操作符描述为:

–w文件可通过有效的UID/GID写入

我有两个文件:

-rwsrwxrwx 1 testuser testuser 226 Jul 20 20:31 script.pl
-rw-rw-r-- 1 testuser testuser  34 Jul 14 17:24 file.txt
suid
设置在
script.pl
上,所以当我以用户caligula的身份运行它时,有效的UID/GID应该是testuser的UID/GID
script.pl
是:

#!/usr/bin/perl
use v5.14;
if (-w 'file.txt') {
    say "true";
}
else {
    say "false";
}
但是当我运行它时
caligula@ubuntu-主机:~$./script.pl
输出总是
false
。为什么会发生这种情况,可能是因为我不理解该运算符的正确用法


非常感谢。

Perl可以配置为忽略SUID脚本;这是默认设置,很可能是您的设置方式。您应该在脚本中打印真实有效的UID和GID

您可以使用一个稍微模糊的Perl one liner来具体验证这一点:

$ perl -MConfig -e 'foreach $key (keys %Config) { print "$key = $Config{$key}\n"; }' |
> grep -i -e 'se*t*[ug]id'
d_dosuid = 
d_setresgid = define
d_setresuid = define
d_suidsafe = 
$
或者,现在我找到了正确的名字,不那么模糊了:

$ perl -MConfig -e 'print "d_suidsafe = $Config{d_suidsafe}\n"'
d_suidsafe = 
$
这表明这个Perl(我构建的5.12.1)并不认为SUID脚本是安全的

真实有效的用户和组ID值可通过以下方式报告:RUID
$
、RGID
$(
和EGID
$)
,或者(更合理地说)使用英语:

#!/usr/bin/env perl
use English '-no_match_vars';
print "EUID = $EUID; RUID = $UID; EGID = $EGID; RGID = $RGID\n";

perl-V:'.*se*t*[ug]id.'
//
perl-V:d_suidsafe
FYI:perl 5.16.0现已上市,但这对除我之外的所有人来说可能都是老生常谈,因为tar ball的最新日期是2012-05-20,所以大约在那时就打包好了。