Pythonスクリプトを使用して、スーパーユーザーとしてLinuxシステムのコマンドを実行します。
質問
私は自分のマシンにインストールされている接尾辞を持っていると私は(いくつかのアクションに)(の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を設定することができます。
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を" 接頭辞なしでシェルコマンドを呼び出す
あなたはパスワードなしでのsudoコマンドのを実行するユーザーに付与する必要があります。