Python 使用两个字符串输入运行子进程命令

Python 使用两个字符串输入运行子进程命令,python,bash,variables,subprocess,Python,Bash,Variables,Subprocess,我正在尝试使用CA捆绑文件验证证书。原来的Bash命令接受两个文件参数,如下所示: openssl verify -CAfile ca-ssl.ca cert-ssl.crt 我试图弄清楚如何在python子流程中运行上述命令,同时将ca-ssl.ca和cert-ssl.crt作为变量字符串(而不是文件) 如果我在bash中使用变量(而不是文件)运行该命令,那么这将起作用 ca_value=$(<ca-ssl.ca) cert_value=$(<cert-ssl.crt) ope

我正在尝试使用CA捆绑文件验证证书。原来的Bash命令接受两个文件参数,如下所示:

openssl verify -CAfile ca-ssl.ca cert-ssl.crt
我试图弄清楚如何在python子流程中运行上述命令,同时将ca-ssl.ca和cert-ssl.crt作为变量字符串(而不是文件)

如果我在bash中使用变量(而不是文件)运行该命令,那么这将起作用

ca_value=$(<ca-ssl.ca)
cert_value=$(<cert-ssl.crt)

openssl verify -CAfile <(echo "$ca_value") <(echo "$cert_value")

如有任何关于我需要进一步研究的指导/线索,将不胜感激

如果要使用进程替换,则必须使用
shell=True
。这是不可避免的。<代码> BASH进程替换<代码>作为一种简单的方法,你会考虑使用模块吗?也许使用<代码> OS?SoC()/代码>?你确定你的命令是正确的吗?当我在终端中直接运行由列表构造的命令时,我还得到了openssl的用法帮助字符串。还有一件事,您忘记了导入子流程进程替换实际上使用了
/dev/fd/
中的文件。您可能只想使用它创建一个NamedTemporaryFile对象,然后写入它,并将其.name属性传递给子流程。
certificate = ''' cert string '''
ca_bundle = ''' ca bundle string '''

def ca_valid(cert, ca):
    ca_validation = subprocess.Popen(['openssl', 'verify', '-CAfile', ca, cert], stdin=subprocess.PIPE, stdout=subprocess.PIPE,  bufsize=1)
    ca_validation_output = ca_validation.communicate()[0].strip()
    ca_validation.wait()

ca_valid(certificate, ca_bundle)
subprocess.Popen('printf \'argument: "%s"\\n\' verify -CAfile <(echo ca_value) <(echo cert_value);',executable='bash',shell=True).wait();
## argument: "verify"
## argument: "-CAfile"
## argument: "/dev/fd/63"
## argument: "/dev/fd/62"
## 0
bashEsc = lambda s: "'"+s.replace("'","'\\''")+"'";
ca_value = 'x';
cert_value = 'y';
cmd = 'printf \'argument: "%%s"\\n\' verify -CAfile <(echo %s) <(echo %s);'%(bashEsc(ca_value),bashEsc(cert_value));
subprocess.Popen(cmd,executable='bash',shell=True).wait();
## argument: "verify"
## argument: "-CAfile"
## argument: "/dev/fd/63"
## argument: "/dev/fd/62"
## 0
import subprocess
def validate_ca(cert, ca):
    with filearg(ca) as ca_path, filearg(cert) as cert_path:
        ca_validation = subprocess.Popen(
            ['openssl', 'verify', '-CAfile', ca_path, cert_path],
            stdout=subprocess.PIPE,
        )
        return ca_validation.communicate()[0].strip()
import os
import tempfile
from contextlib import contextmanager

@contextmanger
def filearg(txt):
    with tempfile.NamedTemporaryFile('w', delete=False) as fh:
        fh.write(txt)
    try:
        yield fh.name
    finally:
        os.remove(fh.name)