他のbashスクリプトの設定ファイルとして機能するbashスクリプトがあるとします。
構成.sh:
verbose=yes
echo "Malicious code!"
name=test
スクリプト.sh:
source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"
問題は、config.shに入れたすべてのエントリが実行されるため、これは非常に安全ではないことです。
$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'
より安全にするために、割り当てタスクを整理し、そのタスクだけを実行する必要があると思いました。source
「ここに文書」を渡してこれを行います。
スクリプト.sh:
source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"
(はい、正規表現はそれほど強力ではありません。私はプレースホルダーにすぎません。)残念ながら、ソースコードはここのドキュメントとうまく機能しないようです。
./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)"
ただし、等号の右側にすべてのkinzのコードを実行することもできます。
a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.
より良いフィルタが必要です。