C ++,linux,没有root的关机命令
Posted
技术标签:
【中文标题】C ++,linux,没有root的关机命令【英文标题】:C++, linux, shutdown command without root 【发布时间】:2020-01-27 19:42:48 【问题描述】:是否可以制作一个只以用户身份运行而不使用root权限的关机脚本?
我找到了这段代码,但它似乎什么也没做:
#include <unistd.h>
#include <sys/reboot.h>
int main ()
sync(); // If reboot() not preceded by a sync(), data will be lost.
setuid(0); // set uid to root, the running uid must already have the
// appropriate permissions to do this.
reboot(RB_AUTOBOOT); // note, this reboots the system, it's not as
return(0); // graceful as asking the init system to reboot.
系统信息:
Linux hosek 4.15.0-48-generic #51-Ubuntu SMP Wed Apr 3 08:28:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
【问题讨论】:
可以,但程序必须标记为 setuid root。只有 root 可以做到这一点。但是在 root 执行一次之后,它就会保持这种状态。 您忽略了来自setuid()
的返回值-它将返回-1,将errno
设置为EPERM
,如果您没有足够的权限,则保持uid 不变。你真的想要if (setuid(0) != 0) perror(""); return 1;
@Omnifarious 所以不可能例如制作这个c
程序,上传到另一台服务器并运行这个命令来重启/关闭服务器?
@genderbee 这是你的意图吗?
@genderbee - 这样看,您是否希望您刚刚在您的服务器上授予登录权限的人能够将其关闭?答案是否定的,而且应该是否定的。 Unix 系统上的随机人员无权关闭系统。如果您想在未经其他人(或公司)同意的情况下关闭其他随机人(或公司)的系统,那么您是在问我们如何做在大多数司法管辖区实际上是非法的事情。
【参考方案1】:
具有 systemd 和适当权限的桌面系统可以从控制台连接到 systemd:
systemctl poweroff
https://wiki.debian.org/UserShutdown
或者通过从 c/c++ 中取消 systemd api
Simple C or C++ API for controlling systemd services
【讨论】:
【参考方案2】:首先,不要这样做。无论你认为你多么想这样做,你都没有。严重地。通过这样做,您主要是在搞乱系统安全性。这些系统很难正确,即使是非常了解它们的人。所以,不要这样做。如果您需要授予某人关闭系统的权限,请弄清楚如何配置 sudo
以允许它。不要走你要走的路。
如果您绝对坚持这样做,或者您只是在玩完游戏后打算擦除的测试虚拟机,请了解如何在可执行文件上设置“setuid”位。
执行以下三个命令:
$ chmod a-w name_of_executable
$ sudo chown root name_of_executable
$ sudo chmod u+s name_of_executable
这将设置它,以便程序有权成为 root,无论谁运行它。不用说,这是一个非常危险的情况,很多事情都可能出错。您的系统上现在有一些可执行文件是以这种方式设置的,但它们是经过强化的、非常仔细编写的可执行文件,已经过广泛的 bug 搜索,如果有人发现它们有问题,它们会很快得到修复。不要自己创建。
另外,为了解决您在问题中陈述的问题,other answer 更好。我正在为您提供如何使您发布的程序正常工作的答案。你不应该使用那个程序。你应该按照other answer 所说的去做。
【讨论】:
“不要做”太多。 suid程序原则上没有错。事实上,它们通常在企业开发盒中非常有用。 @SergeyA - 我是根据提问者的经验水平来推销的。以上是关于C ++,linux,没有root的关机命令的主要内容,如果未能解决你的问题,请参考以下文章