1

簡単な方法:

# Read environment from config file

set -o allexport
source my_config_file.conf
set +o allexport

構成ファイルの形式は次のようになります。

VAR1=eee
VAR2="dsfsdf sd fsdf"
VAR3=$VAR1
# comment    

より安全に行う方法 (いくつかの拡張を許可しますが、構成ファイルで実際にコマンドを実行することはありません)。「安全性」は、特別に細工された攻撃からではなく、構成に間違ったスニペットが時折挿入されることから保護する必要があります。

4

2 に答える 2

3

VAR1=eeeはコマンドなので、どのコマンドを停止しますか? それが外部プログラムであるとしましょう。

1 つの方法は、PATH を破棄することです。

oldPATH="$PATH"
PATH=
set -o allexport 
source /full-path-name/my_config_file.conf 
set +o allexport 
PATH="$oldPATH"

ちょっと待って!コマンドは「ハッシュ化」されているため、最初にハッシュもクリアする必要があるため、hash -r. エイリアスもクリアする必要がある場合があります。たとえばls、エイリアスであることがよくあります。

これは、たとえば のようにコマンドのフル パス名を指定することで簡単に回避/usr/bin/manできますが、それができることの限界です。

于 2012-09-07T16:53:25.197 に答える
0

.conf ファイルを制限して、いくつかの許容されるパターンのみを許可する場合は、次の行に沿って何かを行うことができます。

eval `awk -v FS="=[\"]*" -v RS="[\"]*\n" '/^[A-Z0-9]+=/ { printf("export %s=\"%s\"; ", \$1, \$2); }' my_config_file.conf`;

awk スクリプトレットの正規表現は、次の行に沿って柔軟または厳密にすることができます^((VAR1)|(VAR2)|(VAR3))=

.割り当てを「実行」するために引き続き使用されますが、.conf ファイルから「許容可能な」行のみが実行されます。上記のパターンは、大文字の英字と数字で構成される変数の単純な割り当てのように見えないすべての行をフィルター処理します。洗練された正規表現は、より多くのケースまたは柔軟性を可能にする可能性があります。上記の RS は、末尾の引用符が無視されることを意味します。FS は、引用符が = の後に続く場合、それは無視されると述べています。FS/RS を組み合わせると、値から引用符が取り除かれます。出力は のようなステートメントのみに変換されexport VAR="VALUE"ます。

値がまったく解析されないため、これは「攻撃」から保護しませんが、そのようなフィルタリングは簡単に追加できます。

于 2012-09-07T18:49:33.660 に答える