首页 > 后端开发 > Python教程 > 如何在不执行 Shell 的情况下正确地将变量传递给 `subprocess.Popen()`?

如何在不执行 Shell 的情况下正确地将变量传递给 `subprocess.Popen()`?

Barbara Streisand
发布: 2024-11-28 06:41:10
原创
378 人浏览过

How to Properly Pass Variables to `subprocess.Popen()` without Shell Execution?

Subprocess.Popen() 的变量传递问题

当尝试将存储在变量中的参数传递给 subprocess.Popen() 时,一些用户经历困难。在处理如下参数时尤其如此:

servers[server]['address']
servers[server]['port']
servers[server]['pass']
登录后复制

将这些变量直接应用于 Popen() 命令,如下所示可能会导致错误:

p = subprocess.Popen(
    ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"],
    shell=True,
    stdout=subprocess.PIPE
)
登录后复制

解决方案:禁用 Shell 执行

要解决此问题,请删除来自 Popen() 调用的 shell=True 参数。这将防止 shell 对参数进行特殊处理,从而允许它们作为字符串传递。

import sys
from subprocess import Popen, PIPE

# populate list of arguments
args = ["mytool.py"]
for opt, optname in zip("-a -x -p".split(), "address port pass".split()):
    args.extend([opt, str(servers[server][optname])])
args.extend("some additional command".split())

# run script
p = Popen([sys.executable or 'python'] + args, stdout=PIPE)
# use p.stdout here...
p.stdout.close()
p.wait()
登录后复制

请注意,使用 shell=True 来执行接受用户输入的命令可以提高安全性风险。始终考虑保护用户输入免受潜在漏洞影响的替代方法。

以上是如何在不执行 Shell 的情况下正确地将变量传递给 `subprocess.Popen()`?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板