Как запустить функцию exec () как root и неинтерактивную? - PullRequest
0 голосов
/ 06 марта 2019

Я ищу fork() и exec с привилегиями root.Кажется, что привилегии не передаются из основного потока после вызова функции exec.

Теперь я видел пост здесь , в котором описывается, как запустить процесс от имени пользователя root, но когда япопробуйте их решение ..

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

Команда sudo запрашивает пароль демона.Я ищу неинтерактивный способ запуска процесса от имени пользователя root.Есть ли способ удалить пароль Daemon?

1 Ответ

1 голос
/ 06 марта 2019

Чтобы проверить предпосылку вашего вопроса,

"Кажется, что привилегии не передаются из основного потока после вызова функции exec."

Я написал следующий тестовый код,

#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
...