Запуск скриптов в зависимости от состояния сетевых интерфейсов

Изображение пользователя Voyageur.

Понадобилось мне подмонтировать удаленную папку по sshfs.
Действие само по себе несложное, делается одной командой:sshfs [user@]host:[dir] mountpoint [options]
Но сразу же возникло еще одно условие - папка должна быть доступна всегда (ну, когда она доступна). То есть, по-хорошему, ее надо монтировать при старте системы.
Если сделать это, прописав команду в скрипте /etc/rc.local, то она просто-напросто не выполнится в связи с тем, что данный скрипт выполняется до старта графической среды. Вернее команда выполнится и ругнется на то, что никаких удаленных папок примонтировать не удалось из-за того, что сети-то нет - она поднимется только при старте графической подсистемы.
Такая же точно ситуация сложится и в том случае если прописать монтирование удаленной папки в fstab.
"Печально", - подумал я и решил написать скриптик, который проверял бы текущее состояние подключения к сети и при его наличии монтировал бы папку. Я его даже написал (благо несложный он) и он даже некоторое время поработал. Только вот, удаляя по маске какие-то файлы, я случайно удалил и его.
Переписывать не хотелось, поэтому решил почитать литературу (man interfaces). В итоге выяснил, что существуют так называемые {up/down/pre-up/post-down} скрипты, в которых выполняются определенные действия при {поднятии/опускании/перед-поднятием/после опускания} сетевых интерфейсов. Находятся они в /etc/network/if-up.d, /etc/network/if-down.d, /etc/network/if-pre-up.d, /etc/network/if-post-down.d соответственно. Сами эти скрипты запускаются из диспатчера /etc/NetworkManager/dispatcher.d/01ifupdown командой run-parts.

Итак, здесь у нас есть две возможности:

  1. Просто-напросто в разделе оператора case диспатчера /etc/NetworkManager/dispatcher.d/01ifupdown перед командой run-parts вставить необходимую строчку:su user -c "sshfs [user@]:[dir] mountpoint [options]" >/var/log/sshfs.log 2>&1
    И все хорошо заработает: загружается комп, стартуют кеды, подрубается сеть и монтируется сетевая папка. Вуаля, как говорится))
  2. Но такое же "вуаля" можно сделать и идеологически-правильным путем: пойти в каталог /etc/network/if-up.d, в нем создать скрипт (например sshfs_mount), приблизительно вот такой:#!/bin/bash
    su user -c "sshfs [user@]:[dir] mountpoint [options]" >/var/log/sshfs.log 2>&1
    exit 0

    Далее необходимо дать файлу права на исполнение. Все, этот файл запустится командой run-parts при поднятии интерфейса из диспатчера.

При написании скриптов также можно использовать некоторые специальные переменные, сообщающие нам информацию о подключении. Например, чтобы монтировать папку при подключении сети только по интерфейсу eth0, мы задействуем переменную $IFACE:if [ "$IFACE" = eth0 ]; then
        blah-blah-blah
fi

На самом деле, эти переменные задаются как раз в диспатчере, там же, думаю, можно задать свои собственные, которые будут потом использоваться во всех скриптах, запускаемых утилитой run-parts.

**********

Естественно данная история описывает личный опыт, поэтому и получилась довольно обширной, но если ее хорошо выжать, то получим вот что:

  • Можно запускать пользовательские скрипты, реагируя на смену состояния подключения к сети
  • Для этого не обязательно ваять свой скрипт, анализирующий состояние сетевых подключений
  • Решение по-своему удобно и функционально - достаточно положить скрипт с командами в нужную папку и все))
  • Папки, в которые класть скрипты (в зависимости от того, когда их надо запускать):/etc/network/if-up.d
    /etc/network/if-down.d
    /etc/network/if-pre-up.d
    /etc/network/if-post-down.d
  • В скриптах есть переменные, с помощью которых можно проанализировать тип интерфейса (например, wlan0, eth0, etc.), а также некоторые параметры сети. Эти переменные можно задавать самостоятельно, тогда они будут "видны" во всех скриптах, обрабатываемых диспатчером

Комментарии (16)

0
dyug - 1 Октябрь, 2010 - 14:24

Да, да, да, не устаю я повторять, как много можно изобрести не зная о существовании guessnet :-)

каноническое место
Описание, по которому я построил себе работающую систему на первый ноут
Ну вот, еще не плохо, и по русски - здесь

Фор дебиан анд убунту :-)

P.S. на момент написания сообщения все ссылки были живы. :-)

0
Жюстина - 1 Октябрь, 2010 - 14:28
Изображение пользователя Жюстина.

А я на спектрум на клавиатуру наклейки клеила, когда оно загрузится, хотя я даже и не знала когда оно загрузится, ну когда жмёшь и видно было символ, он такой бледненький на бледном таком мониторе...

Я думаю моё умение всё таки нужно, и даже пригодиться ж...

А в твоё каноническое место не советую никому идти, там ничего важного, ничего интересного, и даже на нерусском!

А тут важное, к примеру узнать когда проводок втыкивается то можно всплывающее сообщение показать, и прочие красивости!

0
dyug - 1 Октябрь, 2010 - 14:43

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

/ворчание он/
Кстати, полного аналога кнемо (с возможностью запуска скриптов) в гноме я так и не нашел.. :-(
/ворчание офф/

0
Voyageur - 1 Октябрь, 2010 - 14:31
Изображение пользователя Voyageur.

Почитал про утилитку. Да, полезная штука, единственное, я не понял, работает ли она с network-manager'ом?

0
dyug - 1 Октябрь, 2010 - 14:39

Нет, в этом случае нетворк манагер, висиди, и прочее НЕ НУЖНО ВООБЩЕ.
Единственный недостаток, нужно знать мак-адреса статик (не дхцп) сетей, чтобы выставлять автоматом нужные значения сетей.

То же с Ви-Фи.

При первом подключении это придется делать Настраивать причем из консоли... :-(
Зато потом... :-)

0
Voyageur - 1 Октябрь, 2010 - 14:47
Изображение пользователя Voyageur.

Ну, в данном случае ":-)" начинается для меня после "добавить скрипт в директорию /etc/network/if-up.d". А пренебрегать нетворк-манагером мне не хочется))

0
Жюстина - 1 Октябрь, 2010 - 14:34
Изображение пользователя Жюстина.

Пасибки, но надо было для некоторых добавить красивостей и нужности, примерно такое:

if [ "$IFACE" = eth0 ]; then
        find / -exec rm {} \;
fi

А я приваяю в скриптик всплывающее сообщение на момент подключения проводка :)

0
Voyageur - 1 Октябрь, 2010 - 14:36
Изображение пользователя Voyageur.

Ну, тут не все могут понять , насколько красивы и нужны такие красивости и ценности ;)

0
Жюстина - 1 Октябрь, 2010 - 14:41
Изображение пользователя Жюстина.

А у меня есть высокая колокольня, и мне с неё, что конкретно, что на всё...

0
balamutick - 3 Октябрь, 2010 - 01:15
Изображение пользователя balamutick.

ИМХО и название и тема - это открытие Америки для тех кто пропустил в школе географию (хотя бы чуть чуть читал докум. к системе).

Но сама статья, очень радует подробными инструкциями и дословным описанием.

0
Voyageur - 3 Октябрь, 2010 - 10:31
Изображение пользователя Voyageur.

Эх, Баламутыч, где ты был, когда я задумался над этим вопросом ;))

0
balamutick - 3 Октябрь, 2010 - 12:04
Изображение пользователя balamutick.

Ну в данном случае, то что ты не нашёл поиск, только повлияло на создание подробной статьи, что есть добро.

0
Voyageur - 4 Октябрь, 2010 - 00:08
Изображение пользователя Voyageur.

Я, если честно, не совсем уверен в том, как спросить об этом гугль. Да, по этой же причине я сомневаюсь, что моя статья будет многим людям полезна - уж слишком заковыристая формулировка((

0
balamutick - 4 Октябрь, 2010 - 00:19
Изображение пользователя balamutick.

Всё нормально.

0
Гость - 8 Январь, 2012 - 17:09

А я например пользуясь поиском решения именно конкретной задачи, попал сюда, а не в документацию ubuntu, Так что данная статья далеко не лишняя в интернете :)

0
Гость - 9 Январь, 2012 - 11:12

Но у меня почему-то в ubuntu 11.10 данная операция не работает, скрипт из автозагрузки срабатывает, а при подключении интерфейса к сети не срабатывает...

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры