我有一个标记为 setuid 的 Perl 脚本,但是当我运行它时,它说我没有这样做的权限。我正在运行 Solaris 10。这适用于另一个系统,但我不知道有什么不同。我究竟做错了什么?
$ ls -l
total 16
-r-sr-x--- 1 root root 7354 Apr 19 2008 myscript
$ ./myscript
./myscript: Permission denied.
我有一个标记为 setuid 的 Perl 脚本,但是当我运行它时,它说我没有这样做的权限。我正在运行 Solaris 10。这适用于另一个系统,但我不知道有什么不同。我究竟做错了什么?
$ ls -l
total 16
-r-sr-x--- 1 root root 7354 Apr 19 2008 myscript
$ ./myscript
./myscript: Permission denied.
我不得不问....该程序由具有root组的root拥有。运行程序的用户显然不是 root (没有 # 作为命令提示符),而是组“root”中的用户?
快速修复似乎适用于这种特定情况:
嗯,对这个问题的回答表明,在更现代的系统上,我只能在程序上设置uid,而不是在 shell 脚本上。可能另一个系统实际上是二进制文件,
虽然我怀疑 mdpc 的答案是正确的,并且您需要更改“其他”的权限,但您可以使用一种方便的技术使脚本以其他用户身份运行。您需要做的是创建一个非常简单的 C 程序,它采用 argv[0],附加类似“.real”的内容,然后执行该字符串。然后将脚本从 foo.pl 移动到 foo.pl.real 并将编译的二进制文件移动到 foo.pl 并设置该二进制文件。现在,当您运行 foo.pl 时,您将以您想要的用户身份运行 foo.pl.real。
与任何 setuid 程序一样,您要确保不会导致安全问题。您应该清理 argv[0] 以确保它是您认为应该运行的程序,或者有人可能会符号链接到二进制文件并获得他们不应该获得的权限。
mdpc 的回答很可能是正确的,但请注意 perl 在运行 setuid 时运行方式不同。
除其他外,它会自动打开 perl 的 taint 模式以强制您在使用输入和 args 之前对其进行清理。它对 PATH 和其他可能被滥用来破坏系统的环境变量也非常挑剔。
有关详细信息,请参阅 perlsec(1)(注意:在某些系统上,包括 debian,perl 文档可作为手册页获得。在其他系统上,几乎可以肯定包括 Solaris 10,您必须运行“perldoc perlsec”而不是“人 perlsec")。
运行
groups
命令以列出您所属的组。您必须是您尝试运行的系统上的根组的成员myscript
。检查脚本所在文件系统的挂载选项。有一个
nosuid
选项可用于允许或禁止 setuid 或 setgid 执行。