私のシェルスクリプトの設定ファイルを使う

私のシェルスクリプトの設定ファイルを使う

私のスクリプトの設定ファイルを作成する必要があります。
例は次のとおりです。

スクリプト:

#!/bin/bash
source /home/myuser/test/config
echo "Name=$nam" >&2
echo "Surname=$sur" >&2

コンテンツ/home/myuser/test/config:

nam="Mark"
sur="Brown"

動作します!

私の質問:この方法が正しいのですか、それとも別の方法がありますか?

ベストアンサー1

source任意のコードを実行できるので安全ではありません。これは問題ではないかもしれませんが、ファイル権限が間違っている場合、ファイルシステムへのアクセス権を持つ攻撃者は、initスクリプトなどの他のセキュリティスクリプトによって生成されたファイルにコードを挿入してアクセス権を得る可能性があります。

これまで私が見つけた最高のソリューションは、ホイールソリューションを不器用に再作成したことです。

myscript.conf

password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /

を使用すると、これは2回実行され、source代わりに次の操作が行われます。echo rm -rf /$PROMPT_COMMAND

myscript.sh(パンチ4)

#!/bin/bash
typeset -A config # init array
config=( # set default values in config array
    [username]="root"
    [password]=""
    [hostname]="localhost"
)

while read line
do
    if echo $line | grep -F = &>/dev/null
    then
        varname=$(echo "$line" | cut -d '=' -f 1)
        config[$varname]=$(echo "$line" | cut -d '=' -f 2-)
    fi
done < myscript.conf

echo ${config[username]} # should be loaded from defaults
echo ${config[password]} # should be loaded from config file
echo ${config[hostname]} # includes the "injected" code, but it's fine here
echo ${config[PROMPT_COMMAND]} # also respects variables that you may not have
               # been looking for, but they're sandboxed inside the $config array

myscript.sh(Mac / Bash 3と互換性があります)

#!/bin/bash
config() {
    val=$(grep -E "^$1=" myscript.conf 2>/dev/null || echo "$1=__DEFAULT__" | head -n 1 | cut -d '=' -f 2-)

    if [[ $val == __DEFAULT__ ]]
    then
        case $1 in
            username)
                echo -n "root"
                ;;
            password)
                echo -n ""
                ;;
            hostname)
                echo -n "localhost"
                ;;
        esac
    else
        echo -n $val
    fi
}

echo $(config username) # should be loaded from defaults
echo $(config password) # should be loaded from config file
echo $(config hostname) # includes the "injected" code, but it's fine here
echo $(config PROMPT_COMMAND) # also respects variables that you may not have
               # been looking for, but they're sandboxed inside the $config array

自分のコードでセキュリティの脆弱性が見つかった場合は返信してください。

おすすめ記事