質問

いようにしていくプロセスとして実行することがスーパーユーザーからpythonスクリプトをサブプロセス.のipythonシェルのようなもの

proc = subprocess.Popen('sudo apach2ctl restart',
                        shell=True, stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)

作品をもってすぐにわかスクリプトから取得: sudo: apach2ctl: command not found.

したものではないでしょうかよsudo取り扱う環境でubuntu.(こ sudo -E apche2ctl restartsudo env path=$PATH apache2ctl restart な利用)

その後、私の質問は、基本的には、場合に走りたい apache2ctl restart としてスーパーユーザーのことを促し、ユーザーのスーパーユーザーのパスワードを必要な時にいつ、どのように行うのか。していましようとする意思がなかったこと保管のパスワードを記述します。

編集:

たって渡すコマンドの両方の文字列)をリストアップしました。のpythonインタプリタは、文字列かなパスワードを迅速かつ適切なものだが、仕事をpythonスクリプトとしても問題一覧ですの画面sudo.

編集2:

ではどう思いますがPopenととも一部のコマンドと文字列の場合シェル=Trueで

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])

なし'シェル=True'をsudoます。

よろしく!

役に立ちましたか?

解決

apache2ctlへのフルパスを与えてみます。

他のヒント

試します:

subprocess.call(['sudo', 'apach2ctl', 'restart'])

サブプロセスは、あなたを促し、およびパスワードで読むことができるようにするために、実際の標準入力/アウト/ ERRにアクセスする必要があります。あなたは、パイプとして、それらを設定する場合は、そのパイプに自分でパスワードを供給する必要があります。

あなたがそれらを定義しない場合、それはsys.stdoutのグラブなど...

別の言い方はお客様のユーザーのパスワードを以下の sudo user.

タイプは以下のコマンドライン:

sudo visudo

その次の行を追加し、置き換えの <username> とお:

<username> ALL=(ALL) NOPASSWD: ALL

ることができ、ユーザーを実行す sudo コマンドなしでお願いパスワードを含む適用開始により当該ユーザーです。 これまでのプログラムセキュリティリスクが

あなたはこのようにpopenのを使用する必要があります:

cmd = ['sudo', 'apache2ctl', 'restart']
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

これは、リストを期待します。

このpython3.5.黄色い肌に黒い模様の錦鯉を使用 サブプロセス モジュールです。パスワードを用いてこのようなもの 不安定な.

サブプロセス モジュール間のコマンドとして、文字列のリストではリストを作成し事前に利用 (株) またはパス全体のリストです。読ドキュメンテーションにあります。

私たちは響きのパスワードおよびその利用 パイプ までsudoを通じて'-S'を引数に使います。

#!/usr/bin/env python
import subprocess

sudo_password = 'mysecretpass'
command = 'apach2ctl restart'
command = command.split()

cmd1 = subprocess.Popen(['echo',sudo_password], stdout=subprocess.PIPE)
cmd2 = subprocess.Popen(['sudo','-S'] + command, stdin=cmd1.stdout, stdout=subprocess.PIPE)

output = cmd2.stdout.read().decode() 

私はすべてのソリューションを試みたが、うまくいきませんでした。セロリと長時間実行されるタスクを実行したかったが、これらのために、私はsubprocess.callではsudoのchownコマンドを実行するために必要な()。

これは私のために働いていたものです。

コマンドラインで、安全な環境変数を追加するには、次のように入力します。

export MY_SUDO_PASS="user_password_here"

それはタイプを働いているかどうかをテストするには:

echo $MY_SUDO_PASS
 > user_password_here

このファイルの末尾に追加し、システムの起動時にそれを実行するには:

nano ~/.bashrc  
<時間>
#.bashrc
...
existing_content:

  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
...

export MY_SUDO_PASS="user_password_here"
<時間>

あなたはここに、後で、すべての環境変数のパスワード、ユーザ名、ホスト、などを追加することができます。

あなたの変数が用意されている場合は、

あなたは実行することができます:

を更新するには:

echo $MY_SUDO_PASS | sudo -S apt-get update

またはインストール真夜中の司令官

echo $MY_SUDO_PASS | sudo -S apt-get install mc

、sudoで真夜中の司令官を開始するには、

echo $MY_SUDO_PASS | sudo -S mc

やPythonシェル(またはジャンゴ/セロリ)から、再帰的にディレクトリの所有権を変更します:

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

それがお役に立てば幸いです。

これを行うための最も安全な方法は、事前にパスワードの入力を要求し、コマンドにパイプそれをすることです。パスワードを要求すると、パスワードがあなたのコード内の任意の場所に保存され、それはまたあなたのbashの履歴に表示されませんがなくなります。ここでは例があります:

from getpass import getpass
from subprocess import Popen, PIPE

password = getpass("Please enter your password: ")
# sudo requires the flag '-S' in order to take input from stdin
proc = Popen("sudo -S apach2ctl restart".split(), stdin=PIPE, stdout=PIPE, stderr=PIPE)
# Popen only accepts byte-arrays so you must encode the string
proc.communicate(password.encode())
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top