>правда тогда ssh конект отвалится , но можно опять подключится .
Происходит примерно следующее:
1) Вы запускаете скрипт, меняющий правила firewalla, который, разумеется, первым делом делает flush. Т.к. стоит default to deny, любой траффик блокируется.
2) Скрипт работает дальше, добавляя правила по одному. Если нет опции -q, строчки с правилами правила пишутся в stdout.
3) sshd берет stdout скрипта и пытается отправить его вам по сети,
4) и, естественно, обламывается, потому что траффик блокируется. Ошибка считается фатальной и sshd считает сессию разорваной.
5) Вместе с сессией прибивается (сигналом HUP) все, что в ней запущено, т.е. наш скрипт.
Все, сессии нет, в firewall'e пара-тройка правил. Финита.
Как бороться:
1) Можно сделать так, чтобы ipfw не писал ничего в stdout, тогда sshd нечего будет отправлять клиенту во время работы скрипта, и период, когда траффик блокируется, мы успешно минуем. Это делается при помощи указания ipfw опции -q или так: ./my_cool_firewall_script >/dev/null 2>&1. Это будет работать, но все равно гарантии, что sshd не приспичит нам что-нибудь послать пока работает скрипт, нету, так что в один прекрасный миг можно жестоко наколоться.
2) Простейшие варианты:
- Запускать скрипт как nohup имя_скрипта. Наш скрипт будет игнорировать сигнал HUP, который пошлет ему sshd в случае обрыва сессии и отработает целиком. Вывод будет перенаправлен в файл nohup.out в текущем каталоге. Вывод можно будет посмотреть, правда файл можно забыть стереть. Со временем их может много накопиться в разных местах файловой системы :)
- Запускать скрипт как daemon -cf имя скрипта. Тогда скрипт демонизируется, т.е. отвалится от псевдотерминала, и уже не будет частью сессии, т.е. HUP ему не пошлется. Вывода вы не увидите.
- Запускать скрипт в screen. И вывод можно будет посмотреть и скрипт не прервется, и файлов не будет. Если запускать screen в обычном режиме (т.е. не detached), вывод все-таки пойдет через sshd и сессия может отвалиться.
- Запускать скрипт через at. Например at "now +1 min". Вывод придет вам в виде письма, обрыв сессии, разумеется, не страшен.
- Запускать скрипт через cron. Добавить задание как, например, ежеминутное (* * * * *), потом убрать. Дурацкий способ, тем не менее кто-то его использует.
3) Продвинутый способ.
Идеальным решеним будет иметь программу, меняющую правила ipfw, перенаправляя вывод в какой-либо файл (чтобы не беспокоить sshd и не рвать сессию), позаботившись о защите от SIGHUP (чтобы, если сессия все-таки порвется, скрипт доработал и правила не пропали). Кроме того, через некоторый промежуток времени, она должна восстановить предедущую конфигурацию firewall'а. Таким образом вы будете надежно защищены от ошибок при удаленной настройке ipfw. Пожно копнуть еще глубже и, например, останавливать (SIGSTOP/SIGCONT) sshd на время смены правил. Либо настроить ipfw на пропускание пакетов по умолчанию, а последним правилом добавлять deny all, хотя это не особо хороший способ. В общем, думайте. А я думаю кем-то все это уже написано :)