18

私のマシンにpostfixがインストールされており、virtual_aliasをプログラムで(Pythonを使用して)(何らかのアクションで)オンザフライで更新しています。/etc/postfix/virtual_alias のエントリを更新したら、次のコマンドを実行しています。

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
しかし、私はエラーが発生しています:
sudo: sorry, you must have a tty to run sudo

上記の sudo コマンドを人間以外の方法で実行したい (つまり、このシステム コマンドを Python スクリプトから実行している)。では、このコマンドをプログラムで実行するにはどうすればよいでしょうか?

4

6 に答える 6

20

Pythonスクリプトをルート自体として実行することもできます-そうすれば、postfixをリロードするための権限を追加する必要はありません.

または、 のパスワードを必要としないように sudo を構成できます/etc/init.d/postfix

sudo 構成 (visudo 経由) により、NOPASSWD: が許可され、パスワードなしでコマンドが許可されます。http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwdを参照してください。

<username>  ALL = NOPASSWD: /etc/init.d/postfix

または似たようなもの。

于 2009-02-24T19:39:15.337 に答える
4
#include <unistd.h>
#include <stdlib.h>

// gcc -o reload_postfix reload_postfix.c
// chown root reload_postfix
// chmod +s reload_postfix

int main( int argc, char **argv ) {
    setuid( geteuid() );
    system("/etc/init.d/postifx reload");
}

コマンドを setuid されたプログラムにラップします。これにより、すべてのユーザーが postfix を再起動できます。もちろん、実行権限を特定のグループにさらに制限することもできます。

于 2009-02-24T19:43:44.810 に答える
3

エラーに答えるには:「sudo:申し訳ありませんが、sudoを実行するにはttyが必要です」、sudoersファイルに「Defaultsrequiretty」という設定があります。コメントアウトしてみましたが、うまくいきました:D。

于 2009-03-06T13:20:55.133 に答える
2
import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

もちろん、パスワードはプレーンテキストであるため、これはほとんどの場合良い考えではありません。

于 2009-02-24T19:38:21.300 に答える
1

Pythonでこれを行う場合は、次のようにする必要があります。

シェルコマンドを呼び出す行の前にこのコマンドを記述します

os.setuid(os.geteuid())

次に、「sudo」プレフィックスなしでシェルコマンドを呼び出します

于 2013-02-17T20:46:23.590 に答える