0

問題のコンテキストは、一重引用符を含むパスフレーズを openssl 構成ファイルの input_password パラメーターに渡そうとしていることです。

openssl 構成ファイルのマニュアルから取得:

任意の種類の引用符または \ 文字を使用して、特定の文字をエスケープすることができます。行の最後の文字を \ にすることで、値の文字列を複数の行に広げることができます。さらに、シーケンス \n、\r、\b、および \t が認識されます

一重引用符はエスケープできると想定しました。問題は、sed でエスケープされた単一引用符を生成するのが難しいことです。

これは、次の式をスクリプトまたはコマンド ラインから実行した場合、同じ結果が得られないことを意味します。次のコマンドを実行します。

cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|\\\'|g"

「$EMPLOYEE_CREDENTIALS_FILE」は次のような形式のファイルです

username:password

このコマンドをbashで直接実行すると、openssl.confが許容すると想定した出力が生成されます。

tentacle caravan sovereignty appraisal sass\'s

そして、スクリプトで実行すると、通常のエスケープされていないパスフレーズが生成されます。

tentacle caravan sovereignty appraisal sass's

私は何が間違っているのか知りたいです。

4

1 に答える 1

0

私はついに問題を解決しました。

私は現在、openssl 構成ファイルでエスケープされた一重引用符をinput_passwordフィールドに表示できることを確認する立場にあります。それだけでなく、openssl が使用する実際のパスワードは、意図したとおりにエスケープされていません。エンド ユーザーは、構成ファイルでパスワードがエスケープされていることを知ることはありません。

私が理解したことから、二重引用符はバックスラッシュを消費しますが、単一引用符は消費しないため、スクリプト内で sed を機能させるのにかなりの問題がありました。一方、一重引用符はバックスラッシュを消費しないため、エスケープ文字を解釈できません。これは、一重引用符内で一重引用符をエスケープできないことを意味します。

これは私を解決に導きました

 cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|"'\\\'"'|g" 

これは、このスタックオーバーフローの質問にある回答に似ていますが、私の場合はうまくいきません。

3 つのバックスラッシュが必要な理由は、回答にも記載されています。

sed コマンドを二重引用符で囲むことにより、埋め込まれた単一引用符について心配する必要がなくなります。シェルは 1 レベルのエスケープを吸収するため、エスケープについて心配する必要があります。

于 2013-03-12T13:36:51.817 に答える