2017-08-02 15 views
5

私は、特にウェブアプリケーションによって、スクリプトを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: 

パスワード?

答えて

5

あなたは、ファイルのパーミッションでsetuidビットを設定しませんでした:

#-------v 
chmod u=srwx,go=xr restartor 
関連する問題