Чтобы проверить предпосылку вашего вопроса,
"Кажется, что привилегии не передаются из основного потока после вызова функции 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