当用户运行Perl脚本时,我该如何检查其是否具有root权限?

14

我正在编写一个脚本来生成一个配置文件,我想将其存储在/etc/solignis中。当我以受限制的用户身份运行脚本时,它不允许我创建目录或写入文件。因此,脚本必须以sudo或root用户身份运行,我该如何检查用户是否是root或至少在使用sudo?


8
为什么要检查用户是否为root?只需尝试创建目录,检查是否失败,然后在失败时报告消息。换句话说,检查你是否拥有执行某些操作的正确权限的最佳方法是尝试并执行它。 - William Pursell
有点无聊,但是 (getlogin() || getpwuid($<)) eq 'root' 怎么样? - Hugmeir
@William Pursell 是最佳选择,只需尝试并查看即可。如今,由于权限系统变得更加复杂,甚至“root”也可能不再是 root。既然您无论如何都要写它,那就尝试并失败,而不是基于用户名或 uid 做出某些权力假设。 - Will Hartung
4个回答

30
如果$> (也可以用$EFFECTIVE_USER_ID如果你使用了use English)不为零,则该用户不是root。

William Pursell的解决方案可能会更好 - 用户可能已经通过root授予了执行任务所需的权限。 - Arafangion
好的,所以0是root的uid还是gid?一开始我还以为是,后来意识到我犯了一个编码错误,现在它可以工作了。 - AtomicPorkchop
2
这个回答解决了发帖者的问题,但是发帖者问错了问题,最终得到了一个非解决方案。打开文件。如果失败,请报告尝试的操作、完整路径名和系统错误消息($!)。"Permission denied"没有任何歧义,即使用户是root,也可能出现这种情况。 - converter42

4

1

我有同样的问题,并最终使用了前三个答案的所有结果:

die "Must run as root\n" if $> != 0;

0
if ( $< != 0 ) {
print "This script must be run as root\n"; 
exit (0);
}

请注意$<将使用您来自的用户ID。因此,如果您使用sudo,则会针对原始用户而不是root进行检查。如果要针对您将要使用的userid进行检查,则可以使用$>(如上面cjm所回答的)。另外,对于那些想要使用die和unless的人,您可以使用以下语句:除非$< == 0,否则die "This script must be run as root\n"; - armannvg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接