1

私の質問はそれほど明確ではないことを理解しているので、ここで説明してみましょう。

私がやろうとしているのは、特定のタスクを完了した後にコンピューターを一時停止することです。

私のスクリプト:

#my logic or task(Downloading a file)#
cmd = shlex.split("sudo pm-suspend")
>>> subprocess.call(cmd)
[sudo] password for noob: 

ご覧のとおり、パスワードの入力を求められますが、問題は、スクリプトの実行中にシステムに座っていないことです。

ですから、私の質問は、この問題をどのように処理するか、またはこの問題に取り組むために他にどのような代替方法が存在するかということです。

Pythonのバージョンは2.7.3です。

4

2 に答える 2

3

午後の一時停止が/usr/sbin/pm-suspend

sudoersを次の場所に入力します/etc/sudoers

<username> ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend
于 2012-06-19T18:05:45.677 に答える
2

SetUIDビットを使用して、ファイルの所有者のアクセス許可でスクリプトを実行させることができます。所有者をrootに変更し、SetUIDビットを設定することで、特定のファイルを常にrootとして実行できるようにすることができます。SetUIDビットを設定するには:

chmod 4755 <filename>

マスク:4000はSetUID、0700は所有者rwx、0050と0005はグループおよびワールドrxです。

所有者以外のユーザーがこのファイルを編集できないようにする必要があります。編集できる場合は、ユーザーとして任意のコマンドを実行できるため、セキュリティ上のリスクがあります。

必要に応じて効果を上げるには、ファイルの所有者をrootに設定する必要もあります。

sudo chown root <filename>

この場合、<filename>実行するスクリプトは何でもかまいません。実行可能である必要があります。実行可能でない場合、つまりスタンドアロンで実行するように設定されていないPythonプログラムを実行しようとしている場合は、それを起動するラッパーを使用する必要があります。

詳細情報: http: //en.wikipedia.org/wiki/Setuid

SetUIDビットの使用に関連するセキュリティリスクがいくつかあることに注意してください。説明が必要な場合は、さらにコメントを投稿してください。

コメント提供者は、おそらくこれはシェルスクリプトでは機能しないと指摘しています。代わりに、CやC++などのコンパイル言語からプロセスを呼び出すラッパーを使用する必要があります。

/* setuid_wrapper.cpp */
#include <unistd.h>

int main(int c, char * v[])
{
    // the program to execute
    // replace this with the program you want to call.
    const char * executable = "/bin/false";

    // arguments to pass to program
    // MUST be null terminated, MUST start with executable path
    const char * arguments[] = {executable, "arg1", "arg2", "etc...", NULL};

    execv(executable, arguments);
    perror("execv: ");
    return 1;
}

コンパイル:

g++ -o setuid_wrapper setuid_wrapper.cpp

前の指示に従って、所有者をrootに変更し、SetUIDビットを設定し、必要に応じてスクリプトの代わりにそれを実行するようにシステムを構成します。

于 2012-06-19T18:14:54.423 に答える