【问题标题】:How to execute set of commands after sudo using python script如何使用python脚本在sudo之后执行一组命令
【发布时间】:2016-08-30 14:01:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: python linux shell subprocess


    【解决方案1】:

    您的 shell 脚本示例中 &lt;&lt; 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()
    

    如果您需要进程的标准输出和/或错误的输出,那么您也需要通过管道传输这些内容并使用 communicate() 调用的返回值。

    【讨论】:

    • 非常感谢二十一点。您提供的解决方案有效。再告诉我一件事,如何在 shell 命令中使用 shell 变量。例如SHELL_COMMANDS=r'''\ 。 /users/home/$USER/deployment.py ''' 在此,您可以看到我正在尝试传递路径中的 shell 变量 $USER。但是当然 python 不能扩展这个变量。你能告诉我是否可以在这里使用 shell 变量吗?
    • 因为它是由一个完全不应该成为问题的 shell 执行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多