私は、特にウェブアプリケーションによって、スクリプトをrootとして実行することの意味を理解しています。しかし、私のウェブアプリケーションの一環として、私はtorとcurlを使う必要があり、これは時折ipをリセットする必要があります。サービスがservice tor restart
で再起動されると、torは新しいipを取得できます。 rootだけがそれを行うことができるので、私は必要なものを実行するCラッパースクリプトを作成し、それをコンパイルしてsetuid rootを設定し、rootユーザーの所有権に変更しました。しかし、特権を持たないユーザーとして実行されているときにrootパスワードを要求します。 rootとして、サービスを再起動するとパスワードを尋ねるべきではありません。rootのパスワードやsudoを使わずに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:
パスワード?