假設我有一個 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'
為了使其更安全,我想我應該 grep 出賦值操作並只執行這些操作。我將透過傳遞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 的 codez:
a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.
你需要一個更好的過濾器。