Bash

安全地將參數傳遞給命令

  • April 18, 2021

眾所周知,做這種事情是個壞主意<command> $FILENAME,因為您可以擁有一個名稱為 example 的文件,-<option>而不是<command>將該文件-<option>作為參數執行,而是使用option<command>執行。 -<option>

那麼有沒有一種通用的安全方法來實現這一點?一個假設是--在文件名之前添加,但我不確定這是否 100% 安全,並且可能有一個命令沒有這個選項。

首先,始終將變數括在雙引號之間(此規則有例外,但當時機成熟時,您會很容易認出它們)。您的文件名包含空格字元的風險與以減號開頭的文件名相同(並且可能更高)。

因此,您的第一個命令應該是:

<command> "$FILENAME"

接下來,-<option>案例。你很好地總結了這個問題:使用--是可以的,但你不能盲目地添加--到你的命令中,因為所有命令都不支持這種語法。

防止包含以減號(或任何其他敏感字元)開頭的文件名的變數的一種非常安全的方法是更改​​文件名以便在其前面添加一個路徑,相對路徑 ( ./file) 或絕對路徑 ( /foo/bar/file) . 這樣,第一個字元是無害的,因為它是.or /

此程式碼將添加一個相對路徑,$filename除非它已經是絕對路徑:

[[ "$filename" != /* ]] && filename="./$filename"

就個人而言,在我的 shell 腳本中,我更喜歡將文件參數更改為它們的規範表示(完整路徑):

filename="$(readlink -f -- "$filename")"

或者:

filename="$(realpath -m -- "$filename")"

(如果您想知道應該使用哪一個,請參閱realpath這個出色的答案readlink

引用自:https://unix.stackexchange.com/questions/644415