![如何在 shell 脚本中包含目录中的所有文件(本例中为 /etc/init.d/iptables)](https://linux22.com/image/488399/%E5%A6%82%E4%BD%95%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%8C%85%E5%90%AB%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%EF%BC%88%E6%9C%AC%E4%BE%8B%E4%B8%AD%E4%B8%BA%20%2Fetc%2Finit.d%2Fiptables%EF%BC%89.png)
我/etc/init.d/iptables start|stop|restart
在不同的 ubuntu 服务器上有一个脚本(这是一个普通的 shell 脚本)
对于每个新服务,我都必须编辑并插入一行来打开端口。这导致不同机器上有许多不同版本的 init.d 脚本。
是否可以自动包含所有文件/etc/iptables/include.d/
?
目标是开始/etc/init.d/iptables 的功能如下
include /etc/iptables/include.d/*
在添加文件后/etc/iptables/include.d/
我只需说
/etc/init.d/iptables restart
编辑:正如 Saurabh 指出的那样,当命令需要特定顺序时,这可能会导致问题。高级设置可以有不同的目录,例如:
/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
它将以 shell 脚本(需要可执行)的形式运行目录中的所有内容。
如果你只想执行以 .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 之间的空格
Saurabh 是对的 - 这不一定会按照您的预期工作,但使用一些命名约定,例如 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 将不知道先放哪些规则,后放哪些规则。