这样使用是否安全?

时间:2015-03-03 10:05:07

标签: bash

我有一个从终端读取的程序,然后将它与几个数字进行比较,例如:

read input
if [ $input == 5 ]
then
  echo "The number is 5"
fi
if [ $input == 42 ]
then
  echo "The number is 42"
fi

请注意,我写这篇文章时没有使用引号。 我无法更改此代码,除非它绝对确定它不安全。 我唯一看到的是,如果$input包含2个或更多单词,它会将错误丢给stderr,并进入else。但是,幸运的是,这并没有打破代码 那么,这样安全吗? (我的意思是输入指定的命令无法执行)如果不是,请附上代码。

编辑:我知道我们使用-eq[[...]],但是当我写这篇文章时,我只是不在乎。问题是改变这段代码是非常困难的,如果这可以执行一些命令(并且可能将输出重定向到stdout或stderr),那么这将是一个大问题,但如果不是这样的话不好,我不会改变这段代码,无论它多么丑陋。

3 个答案:

答案 0 :(得分:2)

无法从$ input运行命令。我在文档中找不到它,但似乎在任何扩展发生之前从命令行解析命令(和重定向)边界。比照

x='echo a ; echo b'
$x

输出:

a ; echo b

或(没有波浪扩展)

x='ls ~'
$x

返回:

ls: cannot access ~: No such file or directory

这同样适用于重定向(尝试x='ls | grep .')。

答案 1 :(得分:1)

if [ $input == 5 ]因为几个原因而不好。使用==是比较两个字符串的非标准方式(更标准的方法是使用单个=)。如果您想比较两个整数,则应使用if [ "$input" -eq 5 ]代替。变量周围的双引号可防止单词拆分。

如果您想利用特定于Bash的功能,可以使用以下方法之一:

if [[ $input -eq 5 ]] # no need for quotes inside `[[`

if (( input == 5 )) # arithmetic context

答案 2 :(得分:0)

使用[[]]并使用==进行比较的相对安全方法不会产生明确的错误:

read -p "Enter value: " input

if [[ $input == 5 ]]; then
  echo "The number is 5"
elif [[ $input == 42 ]]; then
  echo "The number is 42"
fi

即使您在input变量中输入2个字符串单词,也不会产生错误。

有关详细信息,请在终端中运行help [[