Я понимаю последствия запуска сценария от имени пользователя root, особенно в веб-приложении. Однако, как часть моего веб-приложения, мне нужно использовать curl с tor, и для этого нужно время от времени сбрасывать tor ip. tor может получить новый ip при перезапуске сервиса с service tor restart
. Поскольку это может сделать только root, я написал сценарий-оболочку C, чтобы делать то, что мне нужно, скомпилировал его, установил для него setuid root и перешел на пользователя root. Тем не менее, он по-прежнему запрашивает у меня пароль root, когда он запускается как непривилегированный пользователь. Как root, перезапуск службы не должен запрашивать пароль.
Мой сценарий:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void ExecAsRoot (char* str);
int main ()
{
setuid (0);
setvbuf(stdout, NULL, _IONBF, 0);
printf ("Host real ip is: ");
ExecAsRoot("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/'");
ExecAsRoot("/usr/sbin/service tor restart");
// sleep(2);
printf ("Tor should have switched to a new ip by now.\nNew ip is: ");
ExecAsRoot("torify curl ifconfig.co 2>/dev/null");
return 0;
}
void ExecAsRoot (char* str) {
system (str);
}
Я сделал следующее:
chown root restartor
chmod u=rwx,go=xr restartor
Выход:
Host real ip is: 7.17.11.23
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart 'tor.service'.
Authenticating as: root
Password:
Как я могу заставить это работать как веб-пользователь без предоставления пароля root?