【问题标题】:Why the file-test operator does not work (Perl)?为什么文件测试运算符不起作用(Perl)?
【发布时间】:2023-04-10 07:42:02
【问题描述】:

在“Programming Perl”-wfile-test 操作符中描述为:

-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 的。 script.pl 是:

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

但是当我运行它caligula@ubuntu-host:~$ ./script.pl 时,输出总是false。为什么会这样,可能是我没理解那个操作符的正确用法?

感谢。

【问题讨论】:

  • 仅供参考:Perl 5.16.0 现在可用,尽管这对除我以外的所有人来说可能都是旧消息,因为 tar 球中的最新日期是 2012-05-20,所以它是在那时打包的。

标签: perl unix access-rights


【解决方案1】:

可以配置 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 脚本是安全的。

真实有效的用户和组 ID 值可通过以下方式报告:RUID $<、EUID $>、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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2018-09-20
  • 2017-03-16
相关资源
最近更新 更多