
技術承認テストを自動化するためのいくつかのスクリプトを作成しました。パスワードをプレーンテキストとして書き込むことは許可されていないため、私が使用するスクリプトは複数の変数に関連付けられており、そのうちの1つはパスワードです。実行する前に、password.key=mycryptedpassword
ファイルからその行を取得し、パスワードを復号化してスクリプトで使用します。その後、キーをスクリプトで使用される一時ファイルのパスワードに置き換えようとしました。ここで問題が発生します。次のコードを使用します。
sed -i -e 's/$key/$decryptedPassword/g' json.tmp
一般的にはうまくいきますが、私が出会ったパスワードの1つは次のとおりです。cl&&TiT8
sedとlinux(私は基本的にredhatでkshシェルを使用しています)にこれらの&&
。もしかしたらこんなに奇妙なパスワードを使う方に会うかと心配になるのにどう対処すればいいですか?
概要:これが私がしたことですsed -i -e 's/$key/$decryptedPassword/g' json.tmp
。当時、$decryptedPassword = cl&&TiT8
これはうまくいきませんでした。
答え1
sedでこれを行うと、そのs/regexp/replacement/
文字&
はreplacement
特別な意味を持ち、その文字が表示されると一致する文字列に展開されますregexp
。したがって、次のようにエスケープする必要があります\
。
sed -i -e 's/$key/cl\&\&TiT8/g' json.tmp
/
また、and'
と\
andもエスケープする必要があります$key
。$decryptedPassword
sedコマンドを置き換える方法は$key
?$decryptedPassword
答え2
'$key'
私は判断しませ$key
ん"$key"
。
努力する
d2=$(echo "$decryptedPassword" | sed -e 's.&.\\\&.g' )
sed -i -e "s/$key/$d2/g" json.tmp
- 提供も含まれてい
$key
ません$decryptedPassword
/
交換モードで使用する必要があるため、最初にany -をこれに置き換える必要があり
\&
ます。また、および&
すべてをエスケープする必要があることを考慮して、\
&
\\\&
内部に「セド両方
's.&.\\&.g'
です's.&.\\\&.g'
。- with
's.&.\\&.g'
,\
エスケープ自体, while&
置換&
(sed 置換によって) - with
's.&.\\\&.g'
、\
独自にエスケープして '\&' を置き換えます (sed 置換なし)。