走行コマンドとしてスーパーユーザーからのpythonスクリプト
-
05-09-2019 - |
質問
いようにしていくプロセスとして実行することがスーパーユーザーから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 restart
や sudo 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())