2012-07-20 109 views
6

在 “编程的Perl” -w文件测试操作描述为:为什么文件测试运算符不起作用(Perl)?

-w File是通过有效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,所以当我运行它为用户古拉,有效的UID/GID应该是testuser的公司之一。 script.pl是:

#!/usr/bin/perl 
use v5.14; 
if (-w 'file.txt') { 
    say "true"; 
} 
else { 
    say "false"; 
} 

但是当我运行它[email protected]:~$ ./script.pl输出始终false。为什么会发生这种情况,可能是我不明白该运算符的正确用法?

我的赞赏。

+1

供参考:Perl的5.16.0是现在可用,尽管这可能对除了我之外的每个人都是个新闻,因为焦油球最近的日期是2012-05-20,因此它已经被打包了。 – 2012-07-20 21:49:40

回答

11

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

您可以验证这个具体有小幅晦涩的Perl一行代码:

$ 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脚本是安全的。使用英文RUID $<,EUID $>,RGID $(和EGID $),或(更明智地)::

的真实有效的用户和组ID的值是可报告与

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

'perl -V:'。* se * t * [ug] id。*''///'perl -V:d_suidsafe' – ikegami 2012-07-20 20:25:06