Правильное цитирование в eval

В Debian и его производных скрипты из /etc/network/if*.d выполняются, когда интерфейс повышается или понижается. Это особенность механизма статической конфигурации сети Debian через / etc / network / interfaces , который также выполняет NetworkManager. Поэтому добавьте сценарий в /etc/network/if-down.d или /etc/network/if-post-down.d в зависимости от того, хотите ли вы, чтобы ваш сценарий выполнялся. до или после того, как интерфейс выйдет из строя. В каждом каталоге сценарии выполняются в лексикографическом порядке, поэтому вы можете захотеть начать имя вашего сценария с 0 или zzzz , если вам нужно, чтобы он выполнялся первым или последним. Обратите внимание, что имя сценария подчиняется ограничениям : используйте символы A-Za-z0-9 -_ (в частности, нет . ).

Если вам нужна информация о нарушенном сетевом соединении, вы можете использовать переменные среды, перечисленные на странице руководства interfaces (5) . Если вам нужна информация об оставшемся сетевом подключении, вы можете вызвать ifconfig , route , ip и т. Д.

3
05.05.2019, 11:34
1 ответ

Здесь не нужно eval. Вы можете просто использовать"$@":

while
    "${@}"
    exitcode="${?}"
    [[ "${exitcode}" -ne 0 && "${try}" -lt "${tryMax}" ]]
do...

"$@"расширит все аргументы скрипта как отдельные «слова»-с учетом исходного цитирования, которое предотвратило разбиение слов -, а затем оставит вам первый аргумент в качестве команды, ожидающей выполнения. запустить (cat), а остальные аргументы в качестве аргументов дляcat(docu ment).

Там, где это не сработает:

  • Если вы хотите, чтобы переданная команда использовала другие конструкции оболочки более высокого -уровня, такие как конвейеры, определения функций, циклы и т. д. Все они обрабатываются до раскрытия параметра и не будут предприниматься снова после "$@"расширен.
  • Если команда имеет отрицательный код возврата ! cmd. !также обрабатывается в начале обработки команды перед расширением параметра.
  • Если команда состоит из нескольких команд x \; yили $'x\ny'или x $'\n' y, или то же самое с &&или ||. Все это обычные аргументы.
  • Если вашей команде предшествуют назначения переменных, например LD_LIBRARY_PATH=/x foo. Вы можете поставить их перед именем скрипта, но не перед аргументом команды.
  • Если в команде есть перенаправления >foo, 3<bar. Они могут или не могут быть прикреплены к сценарию, поскольку сценарий имеет собственный вывод журнала.
  • Если команда имеет здесь -документов или здесь -строк. Они будут доступны для чтения только один раз, если они прикреплены к самому сценарию, поэтому в зависимости от того, когда именно команда не работает, вы можете или не можете быть в порядке. В любом случае, их было бы очень трудно передать подходящим образом для eval.
  • Если команда является подоболочкой (... )или группой команд {... ; }.Они будут рассматриваться как команды с именами (и {, а не как синтаксические конструкции.
  • Если команда содержит подстановку команды $(...), которую необходимо выполнить повторно . Вы можете использовать эту (или любую другую конструкцию оболочки )для создания исходных аргументов, но все они будут фиксированными строками после запуска сценария.
  • Если в команде есть какой-либо другой элемент, который должен оцениваться повторно, например$RANDOMили арифметическое расширение$((i++)).
  • Если команда time. Это зарезервированное слово оболочки, а , а не , встроенное -в команду, поэтому оно также обрабатывается перед расширением параметра.

Однако в противном случае вы можете полностью избежать evalи, вероятно, должны это сделать. Очень хрупко построить правильно, даже игнорируя любые возможные проблемы безопасности.

4
27.01.2020, 21:17

Теги

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