python os.system:予期しないマーカー"("の近くに構文エラーがあります - 入れ子の括弧

python os.system:予期しないマーカー

Pythonでコマンドを送信するときにbash角かっこを引用符で囲むことができることを読んだ。この例では、シェルで実行されるコマンドを使用してopensslのキーとcsrを生成しようとしていますが、Pythonで実行すると生成しません。いくつかの組み合わせを試しましたが、引き続き別の問題が発生しました。

次のPythonコマンドは失敗します。

import os

os.system('openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/[email protected]" -reqexts OPTS -config <(cat /etc/pki/tls/openssl.cnf <(printf "[OPTS]\  basicConstraints = CA:FALSE  subjectAltName = DNS:mynode,DNS:myf5  keyUsage = digitalSignature, keyEncipherment  extendedKeyUsage = serverAuth, clientAuth"))')

デフォルトのopensslコマンドが成功しました。

openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/[email protected]" -reqexts OPTS -config <(cat /etc/pki/tls/openssl.cnf <(printf "[OPTS]\  basicConstraints = CA:FALSE  subjectAltName = DNS:mynode,DNS:myf5  keyUsage = digitalSignature, keyEncipherment  extendedKeyUsage = serverAuth, clientAuth"))

これは簡単なはずですが、答えが見つかりません。

ベストアンサー1

<(…)bash(およびkshとzsh)には存在しますが、通常のshには存在しないプロセスの置き換えです。このsystem関数は bash ではなく sh を呼び出します。

パイプでプロセス置換を使用し、入れ子にopensslなったプロセス置換を簡単なコマンドシーケンスに減らすことができます。

{ cat /etc/pki/tls/openssl.cnf;
  printf "[OPTS]\  basicConstraints = CA:FALSE  subjectAltName = DNS:mynode,DNS:myf5  keyUsage = digitalSignature, keyEncipherment  extendedKeyUsage = serverAuth, clientAuth";
} | openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/[email protected]" -reqexts OPTS -config -

(改行オプション)

おすすめ記事