安全地将参数传递给命令

安全地将参数传递给命令

众所周知,做类似的事情是一个坏主意<command> $FILENAME,因为您可以拥有一个名称为例如的文件-<option>,然后而不是<command>将该文件-<option>作为争论,<command>将与执行选项 -<option>

那么有没有一种通用的安全方法来实现这一点呢?一种假设是在文件名之前添加--,但我不确定这是否 100% 安全,并且可能有一个命令没有此选项。

答案1

首先,始终将变量括在双引号之间(此规则也有例外,但到时候您会很容易识别它们)。文件名包含空格字符的风险与以减号开头的文件名同样高(甚至可能更高)。

因此,您的第一个命令应该是:

<command> "$FILENAME"

接下来是-<option>案例。您很好地总结了这个问题:使用--是可以的,但您不能盲目地添加--到您的命令中,因为所有命令都不支持此语法。

防止包含以减号(或任何其他敏感字符)开头的文件名的变量的一种完全安全的方法是更改​​文件名,以便在其前面添加路径,可以是相对路径 ( ./file) 或绝对路径 ( /foo/bar/file) 。这样,第一个字符是无害的,因为它是./

此代码将添加相对路径,$filename除非它已经是绝对路径:

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

就个人而言,在我的 shell 脚本中,我更喜欢将文件参数更改为其规范表示形式(完整路径):

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

或者:

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

(如果您想知道应该使用哪一个realpathreadlink请参阅这个优秀的答案

相关内容