シェル スクリプトにディレクトリ内のすべてのファイルを含める方法 (この場合は /etc/init.d/iptables)

シェル スクリプトにディレクトリ内のすべてのファイルを含める方法 (この場合は /etc/init.d/iptables)

異なるUbuntuサーバーにスクリプトがあります/etc/init.d/iptables start|stop|restart(通常のシェルスクリプトです)

新しいサービスごとに、ポートを開くための行を編集して挿入する必要があります。これにより、異なるマシンで 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

ディレクトリ内のすべてをシェル スクリプトとして実行します (実行可能である必要があります)。

.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 はどのルールを最初に配置し、どのルールを後に配置するかがわかりません。

関連情報