我可以将长 bash 命令传递给 asyncio.subprocess.create_subprocess_exec() 吗?

Posted

技术标签:

【中文标题】我可以将长 bash 命令传递给 asyncio.subprocess.create_subprocess_exec() 吗?【英文标题】:Can I pass a long bash command to asyncio.subprocess.create_subprocess_exec()? 【发布时间】:2017-07-14 20:28:40 【问题描述】:

马上,有一个类似的问题here,但它并没有完全回答 my 的问题。不过,我在那里留下了评论以防万一。

asyncio 中有一个asyncio.subprocess.create_subprocess_exec 协程模仿更常见的subprocess.Popen 命令和shell=False,以防止shell 注入。 Popen 接受 list 字符串,但 create_subprocess_exec 只接受字符串,例如

asyncio.subprocess.create_subprocess_exec('ls', '-lah', 'myfile', stdout=..., stderr=..., stdin=...)

我有一个 bash 命令作为一个大字符串,例如s = 'ls -lah myfile'。我想将命令传递给create_subprocess_exec 但是像s.split() 这样的列表不起作用! 怎么办?

【问题讨论】:

【参考方案1】:

看来asyncio.subprocess.create_subprocess_exec会接受一个星号列表作为一系列参数,所以解决方案应该是

cmd = ['ls', '-lah', 'myfile']
asyncio.subprocess.create_subprocess_exec(*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, stdin=asyncio.subprocess.PIPE)

请注意,以这种方式格式化 bash 命令可能很困难,尤其是我正在寻找的rsync

【讨论】:

如果参数列表/单个参数太长以至于命令行无法容纳它怎么办?对于这种情况,您有什么建议?

以上是关于我可以将长 bash 命令传递给 asyncio.subprocess.create_subprocess_exec() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

将长 Unicode 字符串传递给 FireDac TADQuery 参数

将bash变量传递给python命令[关闭]

通过回声管道将python变量(字符串)传递给bash命令[重复]

在bash中将包含空格的变量传递给命令[重复]

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

在 Bash 脚本中将 Telnet 命令传递给 SSH