我正在运行一个覆盆子pi,并希望创建一个可执行文件,它应该在几秒钟之后重新启动它。 (我打算通过ssh触发它并在实际重启之前注销)
我用c ++创建了一个可执行文件,内容为:
#include <cstdlib>
int main () {
system("sleep 5");
system("reboot");
return 0;
}
生成的可执行文件的ls -l:
---s--x--x 1 root ben 6191 Jan 10 15:42 reboot
我的计划现在是将setuid位与root用户结合使用作为二进制文件的所有者,以便任何用户都可以执行reboot命令。
不幸的是,这没有用完,在运行程序时它给了我:
Failed to issue method call: Access denied
Must be root.
有关为什么不起作用的任何解释?
我知道可能有更简单的方法来做到这一点。这个问题的确旨在理解为什么这种方式不起作用。
提前谢谢你和问候
答案 0 :(得分:2)
我与setuid
位和bash
的某些版本有类似的问题。在我的情况下,解决方案是编写这样的程序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
// circumvent busybox ash dropping privileges
uid_t uid = geteuid();
setreuid(uid, uid);
system("do something....");
return 0;
}
我希望这对你也有帮助。
答案 1 :(得分:1)
虽然没有直接回答您的问题,但允许用户使用shutdown
运行sudo
怎么样?您甚至可以指定允许使用的选项(请参阅sudoers(5)
手册页)。或者使用适当的参数创建包装器脚本,并让用户运行它。它甚至可以检查它是否具有适当的权限,并在必要时尝试通过sudo
重新执行自己:
#!/bin/sh
if test `id -u` -eq 0; then
# do your stuff - shutdown, poweroff, whatever
else
exec sudo $0 "$@"
fi
答案 2 :(得分:0)
根据this文档,system()
实际上调用了/bin/sh
,在某些发行版中,它忽略了Set-UID位选项。
您可以尝试使用exec()
而不是system()
并直接调用/sbin/shutdown
吗?