您可以取得“此處文檔”嗎?

您可以取得“此處文檔”嗎?

假設我有一個 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.

你需要一個更好的過濾器。

相關內容