Bash
安全地將參數傳遞給命令
眾所周知,做這種事情是個壞主意
<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