ここから文書を入手できますか?

ここから文書を入手できますか?

他の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.

より良いフィルタが必要です。

関連情報