如何使用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脚本示例<< EOF
和EOF
之间的文本将是写入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()
调用的返回值。
非常感谢你的BlackJack。你提供的解决方案是有效的。再告诉我一件事,如何在shell命令中使用shell变量。对于例如SHELL_COMMANDS = r'''\。 /users/home/$USER/deployment.py'''在这里,你可以看到我正在尝试传递$ USER,一个shell变量的路径。但是Python当然不能扩展这个变量。你能告诉我,我可以在这里使用shell变量吗? – Kalpesh
因为它由shell执行,所以根本不应该成为问题。 – BlackJack