Pythonスクリプトを使用して、スーパーユーザーとしてLinuxシステムのコマンドを実行します。

StackOverflow https://stackoverflow.com/questions/583216

質問

私は自分のマシンにインストールされている接尾辞を持っていると私は(いくつかのアクションに)(のpythonを使用して)プログラムでその場でvirtual_aliasを更新しています。私は、/ etc / postfixの/ virtual_aliasのエントリを更新したら、私はコマンドを実行しています:

私はエラーを取得しています
sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
But:

sudo: sorry, you must have a tty to run sudo

私は、ヒト以外の方法で述べたsudoコマンドを実行する(つまり、私はPythonスクリプトから、このシステムのコマンドを実行しています。)。だから、どのように私はプログラムによってこのコマンドの実行を得るのですか?

役に立ちましたか?

解決

あなたはルート自体としてあなたのPythonスクリプトを実行するか - あなたは接尾辞をリロードする権限を追加する必要はありません。

それとも、/etc/init.d/postfixのパスワードを必要としないためにsudoを設定することができます。

(visudoを経由)

sudoの設定NOPASSWDすることができます:パスワードなしでコマンドを許可します。 http://www.sudo.ws/sudo/man/sudoers.html#を参照してください。 nopasswd_and_passwdする

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

または何か似ています。

他のヒント

#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-edプログラムであなたのコマンドを包みます。これは、任意のユーザの再起動Postfixのようになります。あなたはもちろん、さらに特定のグループに実行権を制限することができます。

エラーに答えるために:「sudoを:申し訳ありませんが、あなたはsudoを実行するための端末を持っている必要があります」、我々はsudoersファイル内の「デフォルトrequiretty」と呼ばれる設定があります。私はそれをコメントアウトしてみました、それが働いた:D

import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")
パスワードがプレーンテキストであるとして

もちろんこれは、ほとんど常に良い考えではありません。

あなたがつもりだ場合は、

pythonでこれを行うあなただけの次の手順を実行する必要があります:

は、

シェルコマンドを呼び出す行の前に、このコマンドを書きます
os.setuid(os.geteuid())

そして、あなたは "sudoを" 接頭辞なしでシェルコマンドを呼び出す

scroll top