如何使用python脚本在sudo后执行一组命令

问题描述:

我正在尝试使用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

在你的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