gpt4 book ai didi

perl - 为什么文件测试运算符不起作用(Perl)?

转载 作者:行者123 更新时间:2023-12-04 13:52:58 25 4
gpt4 key购买 nike

在“Programming Perl”中,-w file-test运算符描述为:

–w File is writable by effective 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应该是测试用户的。 script.pl是:
#!/usr/bin/perl
use v5.14;
if (-w 'file.txt') {
say "true";
}
else {
say "false";
}

但是,当我运行 caligula@ubuntu-host:~$ ./script.pl时,输出始终是 false。为什么会发生这种情况,可能是我不了解该运算符的正确用法?

我的感激。

最佳答案

可以配置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 - 为什么文件测试运算符不起作用(Perl)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com