Как предотвратить внедрение кода / опций в скрипт bash - PullRequest
3 голосов
/ 10 июня 2010

Я написал небольшой bash-скрипт под названием «isinFile.sh», чтобы проверить, можно ли найти первый термин, данный скрипту, в файле «file.txt»:

#!/bin/bash

FILE="file.txt"

if [ `grep -w "$1" $FILE` ]; then 
 echo "true"
else
 echo "false"
fi

Тем не менее, запуск сценария, как

> ./isinFile.sh -x

ломает скрипт, так как -x интерпретируется как grep как опция. Так что я улучшил свой скрипт

#!/bin/bash

FILE="file.txt"

if [ `grep -w -- "$1" $FILE` ]; then 
 echo "true"
else
 echo "false"
fi

используя -- в качестве аргумента для grep. Сейчас работает

> ./isinFile.sh -x
false

работает. Но является ли использование -- правильным и единственным способом предотвращения внедрения кода / параметров в сценарии bash? Я не видел его в дикой природе, только нашел упомянутое в ABASH: поиск ошибок в скриптах Bash .

Ответы [ 3 ]

2 голосов
/ 11 июня 2010

На самом деле в этом сценарии есть еще одна ошибка, связанная с внедрением кода (или как вы хотите ее называть): он просто передает вывод grep команде [ (он же test) и предполагает, что она вернетправда, если он не пустой.Но если длина вывода больше одного слова, [ будет рассматривать его как выражение и пытаться его оценить.Например, предположим, что файл содержит строку 0 -eq 2, и вы ищете «0» - [ решит, что 0 не равно 2, и скрипт выдаст значение false, несмотря на то, что он нашел совпадение.

Лучший способ исправить это - использовать предложение Игнасио Васкеса-Абрамса (как пояснил Деннис Уильямсон) - это полностью исключает проблему синтаксического анализа и также быстрее (так как -q останавливает grepпоиск по первому совпадению).Если бы эта опция была недоступна, другим методом было бы защитить выходные данные двойными кавычками: if [ "$(grep -w -- "$1" "$FILE")" ]; then (обратите внимание, что я также использовал $ () вместо обратных кавычек, потому что я считаю, что их гораздо легче читать, и кавычки около $ФАЙЛ на тот случай, если в нем есть что-нибудь смешное, например, пробел).

2 голосов
/ 10 июня 2010
grep -w -- ...

предотвращает это толкование в следующем -

EDIT

(я не читал последнюю часть извините). Да, это единственный способ. Другой способ - избежать этого как первой части поиска; например ".{0}-x" тоже работает, но странно, например,

grep -w ".{0}$1" ...

тоже должно работать.

1 голос
/ 10 июня 2010

Хотя это не применимо в данном конкретном случае, можно использовать другую технику для предотвращения интерпретации имен файлов, начинающихся с дефисов, как параметров:

rm ./-x

или

rm /path/to/-x
...