题
我正在运行一个树莓派,并且想创建一个可执行文件,该可执行文件应该在几秒钟后重新启动它。(我计划通过 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 作为二进制文件的所有者,以便任何用户都可以执行重新启动命令。
不幸的是,这不起作用,运行程序时它给了我:
Failed to issue method call: Access denied
Must be root.
有什么解释为什么这不起作用吗?
我知道可能有更简单的方法可以做到这一点。这个问题的真正目的是理解为什么这种方式不起作用。
预先感谢您并致以问候
解决方案
我也遇到过类似的问题 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;
}
我希望这也会对您有所帮助。
其他提示
虽然不直接回答你的问题,但允许用户运行怎么样 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
根据 这 文档, system()
事实上调用 /bin/sh
, ,在某些发行版上,它会忽略 Set-UID 位选项。
您可以尝试使用 exec()
而不是 system()
并直接调用 /sbin/shutdown
?
不隶属于 StackOverflow