我最近读到在bash脚本中使用不带引号的参数是危险的。我知道在SQL查询中,转义是至关重要的,但我没有看到以下代码的任何问题(明显的目录遍历除外)
#!/bin/bash
MYDIR="/tmp/$1"
if [ -d $MYDIR ] ; then
/bin/rmdir $MYDIR
fi
分配行中的引号是否足够?
似乎唯一可能的是“if”行说
# ./mm.sh "arg1 arg2"
./mm.sh: line 5: [: /tmp: binary operator expected
但这对我来说似乎并不危险。我错过了什么吗?
修改:更具体一点。当我使用sudo mm.sh
运行时,有什么办法可以提升我的权限吗?
此致
的Lukas
答案 0 :(得分:1)
rmdir
拒绝删除非空目录,因此您的脚本不太可能有任何真正的灾难性后果。你仍然可以尝试弄清楚当你打电话时会发生什么
./mm.sh ' -o -n /home/lukas/xyz'
答案 1 :(得分:1)
好的,如果你有一个带有空格的目录/tmp/foo bar
怎么办?
如果你以这种方式传递参数,而不引用:./mm.sh foo bar
您的脚本会检查/tmp/foo
,如果您确实有/tmp/foo
,则会将其删除,这不是您想要的。
危险并不总是意味着会意外删除某些内容。如果您不引用,您的脚本将错误地解析并使用您的参数。它可能会停止运行,就像您的示例一样,它可能会运行,但不正确。考虑一下您的脚本是否生成重要报告,但报告不正确。这不危险吗?