Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;,linux,不带root的shutdown命令_C++_Linux_Root_Shutdown - Fatal编程技术网

C++ C++;,linux,不带root的shutdown命令

C++ C++;,linux,不带root的shutdown命令,c++,linux,root,shutdown,C++,Linux,Root,Shutdown,是否可以创建一个只以用户身份运行而不使用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

是否可以创建一个只以用户身份运行而不使用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.
}

具有systemd和相应权限的桌面系统可以从控制台与systemd进行交互:

systemctl关机

或者通过从c/c中卸载systemd api++


首先,不要这样做。不管你多么想做,你都不会。认真地你这样做在很大程度上扰乱了系统安全。这些系统很难纠正,即使是非常了解它们的人。所以,不要这样做。如果您需要授予某人关闭系统的权限,请了解如何配置
sudo
以允许它。不要走你要走的路

如果你绝对坚持这样做,或者你只是在一个测试虚拟机上玩,你打算在玩完之后擦除它,那么学习如何在一个可执行文件上设置“setuid”位

执行以下三个命令:

$ chmod a-w name_of_executable
$ sudo chown root name_of_executable
$ sudo chmod u+s name_of_executable
这将对其进行设置,以便无论是谁运行该程序,该程序都有成为root用户的权限。不用说,这是一个非常危险的局面,很多事情都可能出错。现在,系统中有一些可执行文件是这样设置的,但它们是经过强化的,非常仔细地编写的可执行文件,它们已经被广泛地搜索错误,如果有人发现错误,它们会很快得到修复。不要自己创造一个


另外,为了解决你在问题中所说的问题,这个方法要好得多。我给你的答案是如何让你发布的程序工作。不过你不应该用那个程序。你应该照上面说的做。

是的,但程序必须标记为setuid root。只有root才能做到这一点。但在root执行一次后,它将保持这种状态。您忽略了
setuid()
-中的返回值,它将返回-1,将
errno
设置为
EPERM
,如果您没有足够的权限,则保持uid不变。你真的想要
if(setuid(0)!=0){perror(“”;返回1;}
@Omnifarious,所以它是不可能的,例如,制作这个
c
程序,上传到另一台服务器,运行这个命令来重新启动/关闭服务器?@genderbee是你的意图吗?@genderbee-这样看,您是否希望您刚刚在服务器上授予登录权限的人能够将其关闭?答案是否定的,应该是否定的。Unix系统上的随机用户没有关闭系统的权限。如果你想在未经其他人(或公司)同意的情况下关闭他们的系统,那么你是在问我们如何做一些在大多数司法管辖区实际上是非法的事情。太多的“不做”。suid程序原则上没有错。事实上,它们在企业开发箱上通常非常有用。@SergeyA-我是在向提出问题的人介绍经验水平。
$ chmod a-w name_of_executable
$ sudo chown root name_of_executable
$ sudo chmod u+s name_of_executable