我制作了一个 perl 脚本来更改其他用户拥有的文件的所有者。脚本已完成。我的管理员将其保存在/sbin 目录中,并使用 chmod u+s name_of_script 为其设置 uid。但是,当我运行此脚本时,它会提示我不允许执行 chown
操作。我制作了一个 C 程序,它按照相同的步骤工作。所以我的问题是,如果 setuid 正在为 perl 工作,那么我不应该得到那个错误,因为 C 代码没有给我任何错误。那么我可以为 perl 脚本设置 setuid 还是应该使用 C 代码。
不要告诉我每次都要求管理员更改所有者。实际上在服务器中我有用户名暂存并且我在其中托管了一个 joomla 站点。现在,当我安装一些插件时,与该插件相关的文件归 www-data 所有。所以这就是为什么我不想每次都去管理。或者你也可以给我一些关于我的问题的其他解决方案。
最佳答案
许多 unix 系统(可能是最现代的系统)忽略了解释器脚本上的 suid 位,因为它打开了太多的安全漏洞。
但是,如果您使用的是低于 5.12.0 的 perl,您可以运行设置了 setuid 的 perl 脚本,它们将以 root 身份运行。它的工作原理是,当正常的 perl 解释器运行时,检测到您尝试执行的文件设置了 setuid 位,然后它会执行一个名为 suidperl 的程序。 Suidperl 负责提升用户的权限,并以 super 安全模式启动 perl 解释器。 suidperl 本身使用 setuid root 运行。
这样做的后果之一是污点模式会自动打开。还执行其他附加检查。您可能会看到如下消息:
Insecure $ENV{PATH} while running setuid at ./foobar.pl line 3.
perlsec提供了一些有关保护此类脚本的有用信息。
suidperl 通常没有默认安装。您可能必须通过单独的软件包安装它。如果未安装,则会收到此消息:
Can't do setuid (cannot exec sperl)
说了这么多 - 你最好还是使用 sudo以提升的权限执行操作。它更加安全,因为您可以通过 sudoers 文件准确指定允许执行的内容。
从 perl 5.12.0 开始,suidperl 被删除了。因此,如果你想在设置了 setuid 的 perl >= 5.12.0 上运行 perl 脚本,你将不得不编写你自己的 C 包装器。我再次推荐 sudo 作为更好的选择。
关于perl - 我可以设置一个 perl 脚本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21597300/