別の 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.
もっと良いフィルターが必要です。