如何以根用户身份和非交互方式运行exec()函数?

时间:2019-03-06 03:06:30

标签: c permissions exec root daemon

我希望fork()并以root特权执行。似乎一旦调用exec函数,便不会从主线程传递特权。

现在,我已经看到了here的帖子,其中描述了如何以root用户身份运行进程,但是当我尝试其解决方案时。

char sudo[]="/usr/bin/sudo";
char pbin[]="/usr/local/bin/puppet";
execl(sudo,sudo,pbin,(char *)NULL);

sudo命令提示输入守护程序的密码。我正在寻找非交互方式以root身份运行进程。除了删除Daemon的密码之外,还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

要测试您的问题的前提,

  

“似乎一旦执行函数被调用,特权就不会从主线程传递出去。”

我编写了以下测试代码,

#include <unistd.h>
#include <stdio.h>
#include <errno.h>

int main() {
//    printf("starting");
    char sudo[]="/usr/bin/sudo";
    char pbin[]="mkdir";

//    printf("running test: %s %s",sudo,pbin);
    errno=0;

    if (fork() == 0) {
        int res = execl(sudo,sudo,pbin,"/bin/child",(char *)NULL);
//        printf("res:%d", res);
    }
    else {
        sleep(2);
        int res = execl(sudo,sudo,pbin,"/bin/parent",(char *)NULL);
//        printf("res:%d", res);
    }
}

令我惊讶的是,它没有任何问题,给出了以下输出:

$ sudo rm /bin/parent -rf ; sudo rm -rf /bin/child/
$ ls /bin/child/ -la
ls: cannot access '/bin/child/': No such file or directory
$ ls /bin/parent/ -la
ls: cannot access '/bin/parent/': No such file or directory

$ gcc main.c
$ sudo ./a.out

$ ls /bin/parent -la
total 8 drwxr-xr-x 2 root root 4096 Mar  6 11:42 . 
drwxr-xr-x 4 root root 4096 Mar  6 11:42 ..
$ ls /bin/child -la 
total 8 drwxr-xr-x 2 root root 4096 Mar  6 11:42 .
drwxr-xr-x 4 root root 4096 Mar  6 11:42 ..

如您所见,父进程以及具有root特权的子进程都会创建一个目录。


正如您所言,这让我想到您的问题实际上是其他问题:

  

“ sudo命令提示输入守护程序的密码。我正在寻找非交互方式以root身份运行该进程。除了删除守护程序的密码之外,还有其他方法吗?”

您真正想要的是无密码的sudo ,可以通过运行来获得

sudo visudo

,然后添加以下行:

ALL     ALL=(ALL) NOPASSWD: ALL

使您的sudoers文件看起来像这样。

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

ALL ALL=(ALL) NOPASSWD: ALL
# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d