Как включить все файлы из каталога в скрипт оболочки (в данном случае /etc/init.d/iptables)

Как включить все файлы из каталога в скрипт оболочки (в данном случае /etc/init.d/iptables)

У меня есть /etc/init.d/iptables start|stop|restartскрипт на разных серверах Ubuntu (это обычный скрипт оболочки)

Для каждой новой службы мне приходится редактировать и вставлять строку для открытия порта. Это приводит к появлению множества различных версий скрипта init.d на разных машинах.

Можно ли автоматически включить, скажем, все файлы в /etc/iptables/include.d/?

Цель состоит в том, чтобы вначинатьфункция /etc/init.d/iptables как

include /etc/iptables/include.d/*

И после дополнительного файла /etc/iptables/include.d/я бы просто сказал

/etc/init.d/iptables restart

Редактировать:Как указал Саураб, это может привести к проблемам, когда команды требуют определенного порядка. Расширенная настройка может иметь различные каталоги, например:

/etc/iptables/include01.d/
/etc/iptables/include02.d/
/etc/iptables/include03.d/

и включив их следующим образом:

    включить /etc/iptables/include01.d/*
    ... возможно, какой-то код находится здесь, в основном файле...
    включить /etc/iptables/include02.d/*
    включить /etc/iptables/include03.d/*

решение1

Добавьте следующую строку в скрипт init.d.

run-parts --report /etc/iptables/include.d

Он запустит все содержимое каталога как скрипт оболочки (он должен быть исполняемым).

Если вы хотите выполнять только файлы, заканчивающиеся на .port, вы можете использовать что-то вроде:

run-parts --regex '\.port$' /etc/iptables/include.d/

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

10_web.port
20_ssh.port
etc..

решение2

for f in /etc/iptables/include.d/*
 . $f
done

обратите внимание на пробел между точкой и %f

Саураб прав — это не обязательно будет работать так, как вы задумали, но используйте какое-нибудь соглашение об именовании, например, 10-xxx, 20-yyy и т. д., и это может быть приемлемо.

решение3

Вы можете определить простую функцию в bash:

function include() {
    for FILE in $( find "$1" -type f -print | sort )
    do
        source $FILE
    done
}

а потом:

include some_dir/*

или даже:

include some_dir/*.conf

решение4

Я не думаю, что можно включать файлы в конфигурацию iptables. Выбор имеет смысл, так как правила брандмауэра во многом зависят от порядка, в котором они написаны. Если мы просто включим файлы в папку, iptables не будет знать, какие правила ставить первыми, а какие — позже.

Связанный контент