2016-08-30 215 views
0

我正在嘗試使用python自動執行部署過程。在部署中,我首先執行「dzdo su - sysid」,然後執行部署過程。但我無法在Python中處理這部分。我在外殼裏做了類似的事情,我用了下面這段代碼,如何使用python腳本在sudo後執行一組命令

/bin/bash 

psh su - sysid << EOF 

. /users/home/sysid/.bashrc 

./deployment.sh 

EOF 

這很好地處理了deployment.sh的執行。它執行sudo,然後使用sysid id執行腳本。 我正在嘗試使用python做類似的事情,但我無法在Python中找到< < EOF的替代方案。

我使用subprocess.Popen來執行dzdo部分,它執行dzdo,但是當我嘗試執行例如下一個命令時說「ls -l」,那麼這個命令不會與sysid一起執行,相反,我不得不退出sysid會話,一旦我退出,它將在我的主目錄中執行「ls -l」使用。有人可以幫助我嗎?

還有一件事,在這種情況下,我不調用任何deployment.sh但我會打電話給像CP命令,RM,等的mkdir

回答

0

在你的shell腳本示例<< EOFEOF之間的文本將是寫入psh過程的標準輸入。所以,你必須重新定向您Popen實例的標準輸入和數據寫入直接到stdin文件的實例或使用communicate()方法:

#!/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() 

如果您需要進程的stdandard輸出的輸出, /或錯誤,那麼你需要管這些,並使用communicate()調用的返回值。

+0

非常感謝你的BlackJack。你提供的解決方案是有效的。再告訴我一件事,如何在shell命令中使用shell變量。對於例如SHELL_COMMANDS = r'''\。 /users/home/$USER/deployment.py'''在這裏,你可以看到我正在嘗試傳遞$ USER,一個shell變量的路徑。但是Python當然不能擴展這個變量。你能告訴我,我可以在這裏使用shell變量嗎? – Kalpesh

+0

因爲它由shell執行,所以根本不應該成爲問題。 – BlackJack

相關問題