Python的subprocess.run能否将所有参数合并为单个字符串传入?
结论
是支持的,有两种常用的实现方案。你原来的写法不可行的原因是系统会把整段参数字符串当成openssl的第一个独立参数,openssl无法识别该非法参数会直接报错。
方案1:开启shell=True直接传入完整命令字符串
直接把整个openssl命令拼接为完整字符串,传入subprocess.run的第一个参数,同时加上shell=True即可:
# 用f-string拼接更简洁 cmd = f'openssl req -out {servername}.csr -newkey rsa:4096 -nodes -keyout {servername}.priv.key -config {configfile}' subprocess.run(cmd, shell=True)
注意事项:Windows下该参数会调用cmd.exe解析命令,完全兼容常规命令写法。如果servername、configfile这类变量来自不可控的用户输入,存在命令注入风险,变量完全由你自己可控的话可以放心使用。
方案2:用shlex.split自动拆分参数(无需开启shell=True)
如果不想开启shell=True,可以用Python内置的shlex模块自动把参数字符串拆成符合要求的列表:
import shlex argument = f'req -out {servername}.csr -newkey rsa:4096 -nodes -keyout {servername}.priv.key -config {configfile}' # 自动拆分参数后和openssl拼接为完整命令列表 cmd_list = ['openssl'] + shlex.split(argument) subprocess.run(cmd_list)
注意事项:该方法会自动处理参数带空格、引号等特殊字符的场景,同时规避了命令注入风险,更推荐变量来源不可控的场景使用。
内容的提问来源于stack exchange,提问作者Bagheera
相关产品推荐
相关产品推荐

