Как удар интерпретирует равный оператор без окружения пробелов в условном выражении?

Существуют другие причины, но с точки зрения безопасности я никогда не хотел бы, чтобы сценарий сделал предположения о корректном пути. Что, если это неправильно и это выполняет неправильную оболочку или интерпретатор? Тот, который был вставлен злонамеренным пользователем? Или что, если это полагается на конкретную оболочку и откажет, если неправильная оболочка используется?

Пользователи могут бездельничать с их путем и повредиться, материал - не доверяют user:-), я провел многочисленные нападения, которые полагаются на пользователя, делающего неправильную вещь с их путем - обычно получением вещей в неправильном порядке - таким образом, я могу ниспровергать нормальный вызов сценария.

Да, я знаю, записали ли Вы сценарий сами, можно вполне справедливо утверждать, что разобрались в своем собственном пути, но интерпретатор не может принять те решения.

5
18.02.2011, 23:08
2 ответа

Полезно помнить это [ на самом деле команда, обычно также доступная как test. В ударе это - встроенное, таким образом, Вы видите документацию с man builtin.

В этом documentaiton:

          test and [ evaluate conditional expressions using a set of rules
          based on the number of arguments.

          0 arguments
                 The expression is false.
          1 argument
                 The expression is true if and only if the argument is not
                 null.
          2 arguments
                 [...]
          3 arguments
                 [...]

Правила с двумя аргументами являются различными тестами, и с тремя аргументами обычно являются сравнениями. При помещении пространства вокруг = Вы получаете три аргумента. Но когда Вы соединяете все это, Вы получаете один аргумент, и как Вы видите, если тот аргумент не является нулевым, это возвращает true.

9
27.01.2020, 20:33
  • 1
    Очень хорошее объяснение на том, почему пробелы вокруг равняются знаку, имеет значение! –  Cory Klein 18.02.2011, 23:15

Равняется оператору, ничего не делает в этом случае.

$S1=$S2 выражения оценивает к фактической строке, со значениями S1 и S2 на месте, эффективно строкового литерала "foo=bar".

Так как этот строковый литерал не является пустым, оператор

if [ "foo=bar" ];

оценивает к истинному, и тело, если оператор выполняется.

4
27.01.2020, 20:33
  • 1
    я изобразил этого прямо прежде, чем отправить вопрос, но поскольку атмосфера stackexchange является одним из изучения, я думал, что могу также добавить свой вопрос и ответ на пул знания, которое является stackexchange, вместо того, чтобы просто отбросить его. –  Cory Klein 18.02.2011, 22:43
  • 2
    И то, что Вы ищете, на самом деле [ "$S1" = "$S2" ]. Иначе, если $S1 или $S2 содержите подстановочный знак или пробелы, они были бы расширены (например, попробовали бы обоих S1='a = a -o a' и S2='b'). В ksh, ударе и zsh, можно использовать [[ $S1 = $S2 ]], потому что [[]] специальный синтаксис оболочки тогда как [ обычная команда с забавным именем. Обратите внимание, что Вам также нужны пробелы вокруг скобок в любом случае. –  Gilles 'SO- stop being evil' 18.02.2011, 23:08

Теги

Похожие вопросы