我有一个标记为 setuid 的 Perl 脚本,但当我运行它时,它说我没有权限这样做。我正在运行 Solaris 10。这在另一个系统上运行正常,但我看不出有什么不同。我做错了什么?
$ ls -l
total 16
-r-sr-x--- 1 root root 7354 Apr 19 2008 myscript
$ ./myscript
./myscript: Permission denied.
答案1
我不得不问……该程序由 root 拥有,组为 root。运行该程序的用户显然不是 root(命令提示符中没有 #),但该用户是否属于“root”组?
针对这个特定情况,似乎可以快速解决问题:
chmod o+rx myscript
答案2
嗯 回答这个问题建议在更现代的系统上,我只能在程序上设置uid,而不能在shell脚本上设置。可能另一个系统实际上是二进制的,
答案3
虽然我怀疑 mdpc 的答案是正确的,而且您需要更改“其他”的权限,但您可以使用一种方便的技术让脚本以其他用户身份运行。您需要做的是创建一个非常简单的 C 程序,该程序接受 argv[0],附加类似“.real”的内容,然后执行该字符串。然后,您将脚本从 foo.pl 移动到 foo.pl.real,并将编译后的二进制文件移动到 foo.pl 并设置该二进制文件的 uid。现在,当您运行 foo.pl 时,您将以您想要的用户身份运行 foo.pl.real。
与任何 setuid 程序一样,您需要确保不会引起安全问题。您应该清理 argv[0],以确保它是您认为应该运行的程序,否则可能会有人符号链接到二进制文件并获得不应获得的权限。
答案4
运行groups
命令列出您所属的组。您必须是尝试运行的系统上的根组的成员myscript
。
检查脚本所在文件系统的挂载选项。有一个nosuid
选项可用于允许或禁止 setuid 或 setgid 执行。
mount|grep rchuck
/home/rchuck on homedir.mydomain.com:/export/home4/03/rchuck remote/read/write/nosetuid/nodevices/intr/retrans=10/retry=3/xattr/dev=59ca539 于 2009 年 7 月 22 日星期三 07:41:23