如何在 shell 脚本中包含目录中的所有文件(本例中为 /etc/init.d/iptables)

如何在 shell 脚本中包含目录中的所有文件(本例中为 /etc/init.d/iptables)

/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 将不知道先放哪些规则,后放哪些规则。

相关内容