繁体   English   中英

使复杂系统命令适应 subprocess.run()

[英]Adapting a Complex System Command to subprocess.run()

我正在编写一个 Python3 脚本,它必须在我的 Ubuntu 20.04.5 LTS 机器上运行这个系统命令:

sudo su - otherUser -c "scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt"

当我手动将此命令粘贴到服务器的命令行时,该命令运行良好。 现在我需要我的 Python 脚本来执行它。 感谢这样的帖子,我相信subprocess.run()命令应该在这里工作。

这是我的测试代码:

import subprocess

def main():
    subprocess.run(["ls", "-l"])            # For testing purposes
    print("===================================================================================")
    cmd = ["sudo", "su - otherUser", "-c", "\"scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt\""]
    print(cmd)        # see the command first
    subprocess.run(cmd)

if __name__ == "__main__":
    main()

Output 是:

me@ubuntu01$ python3 testSubprocess.py
total 4
-rw-r----- 1 demo demo 576 Jan 18 21:08 testSubprocess.py
===================================================================================
['sudo', 'su - otherUser', '-c', '"scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt"']
sudo: su - otherUser: command not found
me@ubuntu01$

如您所知,我真的很困惑如何解析命令以便subprocess.run()可以理解它。 文档( 此处此处)对像我这样的初学者帮助不大。 subprocess.run()的格式为:

subprocess.run(args, *, ...lots of other stuff...)

... args在哪里:

所有调用都需要 args 并且应该是一个字符串,或者程序序列 arguments。通常首选提供 arguments 的序列,因为它允许模块处理任何所需的 escaping 和 arguments 的引用(例如允许空格文件名)。 如果传递单个字符串,则 shell 必须为 True(见下文),否则字符串必须简单地命名要执行的程序而不指定任何 arguments。

我没有完全遵循这一点,但我确实理解subprocess.run()将获取一个字符串列表,这些字符串应该是要执行的命令。 好的。 有人可以解释如何分割我的原始命令吗?

通过反复试验找到解决方案。 原始代码定义命令如下:

cmd = ["sudo", "su - otherUser", "-c", "\"scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt\""]

...以及有效的解决方案:

cmd = ["sudo", "su", "otherUser", "-c", "scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt"]

IE:

  • "su - otherUser"分解为"su", "otherUser"
  • 删除了 SCP 命令周围的双引号

问题未解决?试试以下方法:

使复杂系统命令适应 subprocess.run()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM