如何在使用python脚本的sudo之后执行命令集

时间:2016-08-30 14:01:42

标签: python linux shell subprocess

我正在尝试使用python自动化部署过程。在部署中我做了" dzdo su - sysid"首先,然后执行部署过程。但是我无法在python中处理这个部分。我在shell中做了类似的事情,我使用了以下代码,

/bin/bash

psh su - sysid  << EOF

. /users/home/sysid/.bashrc

./deployment.sh

EOF

这很好地处理了deployment.sh的执行。它执行sudo然后使用sysid id执行脚本。 我正在尝试使用python做类似的事情,但我无法找到&lt;&lt;在python中的EOF。

我正在使用subprocess.Popen执行dzdo部分,它执行dzdo,但是当我尝试执行下一个命令时,例如说&#34; ls -l&#34;,然后这个命令将不会被sysid执行,相反,我不得不退出sysid会话,一旦我退出,它将执行&#34; ls -l&# 34;在我的主目录中没用。有人可以帮我这个吗?

还有一件事,在这种情况下,我没有调用任何deployment.sh,但我会调用cp,rm,mkdir等命令。

1 个答案:

答案 0 :(得分: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()

如果您需要流程的输出&#39; stdandard输出和/或错误然后你需要管道那些并使用communicate()调用的返回值。