「ヒアドキュメント」を入手できますか?

「ヒアドキュメント」を入手できますか?

別の bash スクリプトの設定ファイルとして機能する bash スクリプトがあるとします。

config.sh:

verbose=yes
echo "Malicious code!"
name=test

スクリプト:

source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"

問題は、config.sh に記述されたものはすべて実行されるため、あまり安全ではないことです。

$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'

より安全にするために、代入操作を grep で抽出し、それらの操作のみを実行することにしました。これは、source「ヒア ドキュメント」を渡すことで実現します。

スクリプト:

source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"

(はい、正規表現がそれほど強力ではないことはわかっています。単なるプレースホルダーです。) 残念ながら、ソースは here docs とうまく連携しないようです。

./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''

明らかに、ファイルから構成データを取得するためにさまざまな方法を実行できますが、いずれにしてもその方が安全である可能性が高いです。

しかし、まだこのかゆみは残っています。試したことがうまくいくかどうか知りたいです。何か提案はありますか?

答え1

source <(cat << EOF
A=42
EOF
)
echo $A

出力:

42

答え2

sourceファイル名が必要なので、入力をリダイレクトすることはできません。

私のシステムでは、代わりにプロセス置換を使用できました。

source <( grep = test.sh )

=適切な正規表現に置き換えます。

答え3

直接eval実行できます:

eval "$(grep -P '^\s*\w+=' config.sh)" 
#quotes needed if you want the full content of the file (including newlines etc.)

ソーシングは基本的に以下と同じです。

eval "$(cat file)"   

ただし、等号の右側であらゆる種類のコードが実行される可能性があることに注意してください。

a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.

もっと良いフィルターが必要です。

関連情報