2016-08-30 9 views
0

私はPythonを使ってデプロイメントプロセスを自動化しようとしています。デプロイメントではまず "dzdo su - sysid"を実行してから展開プロセスを実行します。しかし、私はこの部分をPythonで処理することはできません。pythonスクリプトを使ってsudoの後にコマンドセットを実行するには

/bin/bash 

psh su - sysid << EOF 

. /users/home/sysid/.bashrc 

./deployment.sh 

EOF 

これはデプロイメントの実行を非常にうまく処理しています。それはsudoを実行して、sysid idでスクリプトを実行します。 私はPythonを使って同様のことをしようとしていますが、私は< < EOF in pythonの代わりを見つけることができません。

私はdzdoを実行するためにサブプロセスを使用しています。dzdoを実行しますが、次のコマンドを実行しようとしたときなどです。 "ls -l"とすると、このコマンドはsysidで実行されず、代わりにsysidセッションを終了しなければなりません。終了すると、ホームディレクトリに "ls -l"が実行されます。つかいます。誰かが私にこれを助けてくれますか?

そしてもう一つ、となります。mkdirなど、RM、

答えて

0

あなたのシェルスクリプトの例では<< EOFEOF間のテキストを、この場合、私は、任意のdeployment.shを呼び出していないのですが、私は、CPのようなコマンドを呼び出します。 pshプロセスの標準入力に書き込まれます。つまり、あなたのPopenインスタンスの標準入力をリダイレクトし、直接あなたのインスタンスのstdinファイルにデータを書き込んだり、communicate()メソッドを使用する必要があります:あなたは、プロセスのstdandard出力の出力が必要な場合

#!/usr/bin/env python 
# coding: utf8 
from __future__ import absolute_import, division, print_function 
from subprocess import Popen, PIPE 

SHELL_COMMANDS = r'''\ 
. /users/home/sysid/.bashrc 
./deployment.sh 
''' 


def main(): 
    process = Popen(['psh', 'su', '-', 'sysid'], stdin=PIPE) 
    process.communicate(SHELL_COMMANDS) 


if __name__ == '__main__': 
    main() 

をし、 /またはエラーがある場合は、それらもパイプして、communicate()呼び出しの戻り値で作業する必要があります。

+0

ありがとう、ブラックジャック。あなたが提供したソリューションは有効です。もう1つ、シェルコマンドでシェル変数を使う方法を教えてください。例えば、 SHELL_COMMANDS = r '' '\。 /users/home/$USER/deployment.py '' 'これで、パスにシェル変数である$ USERを渡そうとしているのがわかります。もちろん、Pythonではこの変数を展開することはできません。ここでシェル変数を使用できるかどうか教えてください。 – Kalpesh

+0

シェルで実行されるので、まったく問題になるはずがありません。 – BlackJack

関連する問題