В 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
и т. Д.
Здесь не нужно 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
и, вероятно, должны это сделать. Очень хрупко построить правильно, даже игнорируя любые возможные проблемы безопасности.