python 在没有 shell 的情况下使用 popen,或使用断言来提高安全性

标签 python regex shell assert popen

使用 subprocess.popen 在我的脚本中调用外部程序。如果没有 shell=True,我无法让它工作,并且添加了一个断言语句来降低危险(我认为)。

相关代码行:

import subprocess
import re
import argparse

parser = argparse.ArgumentParser(description="options")
parser.add_argument("-p", "--prefix", help="prefix for output files")
args = parser.parse_args()

assert re.match("^[a-zA-Z0-9_]+$", args.prefix), "non-alphanumeric characters found"

command = "my_external_program -t type -f %s -m 1 -M 1 -N 0 -H -p 16" % args.prefix
external_stacks_call = subprocess.Popen(command, shell=True, stdout=open(args.prefix + ".log.txt", "a"), stderr=open(args.prefix + ".log.txt", "a"))
external_stacks_call.wait()

问题如下:

  1. 断言语句是否足够安全,可以避免其他人造成的恶作剧/问题或其他意外问题?
    1. 例如有人输入前缀“stuff && rm -rf/”
  2. 在没有 shell=True 选项的情况下不调用同一字符串的最佳方法是什么?

我已经在此处和其他地方查看了有关 shell=True 选项的危险和 shell=True 的危险的几页,但我还没有找到如何避免将其用于外部程序的良好来源

最佳答案

shell=True 将转义空格,但是您也可以为命令行提供参数列表

command = ["my_external_program", "-t", "type", "-f", str(args.prefix), 
           "-m", "1", "-M", "1", "-N", "0", "-H", "-p", "16"]

这将使模块能够正确、更安全地与 shell 交互

如果没有 shell=True 特殊字符将被转义,因此与原始命令等效的是

$ my_external_program\ -t\ type\ -f

等等

这是一个优点,因为 shell 可以以相同的方式转义各种特殊字符

关于python 在没有 shell 的情况下使用 popen,或使用断言来提高安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27427208/

相关文章:

Python - 函数/参数元组列表

python - Flask蓝图架构问题

python - 模拟对象库 ANY 未按预期工作

python - chromedriver 在 html 中选择带有 h1 和 p 部分的元素

正则表达式从 <body>...</body> 中提取代码?

regex - 如何忽略存储在PowerShell字符串变量中的转义序列?

bash - 如何在gradle构建脚本中添加bash和shell脚本目录路径?

regex - ABAP 正则表达式中的贪婪/非贪婪量词

shell - 如何确定命令是否以符合 POSIX 的方式存在?

apache - 将 apache documentRoot 设置为 symlink(便于部署)