gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:19 25 4
gpt4 key购买 nike

我正在尝试使用 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 做类似的事情,但我无法在 python 中找到 << EOF 的任何替代方法。

我正在使用 subprocess.Popen 来执行 dzdo 部分,它执行 dzdo,但是当我尝试执行下一个命令时,例如说“ls -l”,那么这个命令将不会用 sysid 执行,相反,我不得不退出 sysid session ,一旦我退出,它就会在我的主目录中执行“ls -l”,这是没有使用。有人可以帮我解决这个问题吗?

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

最佳答案

<< EOF之间的文字和 EOF在您的 shell 脚本示例中,将写入 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()

如果您需要进程的标准输出和/或错误的输出,那么您也需要将它们通过管道传输并使用 communicate() 的返回值打电话。

关于python - 如何使用 python 脚本在 sudo 之后执行一组命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39229620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com