克服 Subprocess.Popen() 中变量传递的陷阱
在许多脚本中,都会需要使用参数调用外部程序。当这些参数存储在变量中时,subprocess.Popen() 可能会出现问题。虽然看起来很简单,但此过程可能会受到某些陷阱的阻碍。
使用 shell=True 时会出现这样的一个陷阱。此选项在 Unix 系统上以不同方式处理参数,从而导致意外行为。要应对此挑战,建议删除 shell=True。
考虑以下场景:
import subprocess # Populate a 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 the script without shell=True p = subprocess.Popen([sys.executable or 'python'] + args, stdout=subprocess.PIPE)
通过这种方法,可以处理参数准确地,允许外部程序接收预期的输入。
它是需要注意的是,为具有外部输入的命令设置 shell=True 会带来安全隐患。正如子流程文档中所解释的,这种做法可能会使您的脚本面临潜在的漏洞。
以上是如何安全地将变量传递给`subprocess.Popen()`而不存在安全风险?的详细内容。更多信息请关注PHP中文网其他相关文章!