web-dev-qa-db-ja.com

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

さまざまなubuntuサーバーに/etc/init.d/iptables start|stop|restartスクリプトがあります(これは通常のシェルスクリプトです)

新しいサービスごとに、ポートを開くための行を編集して挿入する必要があります。これにより、さまざまなマシンでさまざまなバージョンのinit.dスクリプトが作成されます。

/etc/iptables/include.d/にすべてのファイルを自動的に含めることは可能ですか?

目標は、/ etc/init.d/iptablesのstart関数に次のような行のみを含めることです。

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/

そしてこのようにそれらを含める:

 include /etc/iptables/include01.d/* 
 ...メインファイルにコードが含まれている可能性があります... 
 include /etc/iptables/include02.d /*
include/etc/iptables/include03.d/*
6
user12096

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..
11
rkthkr
for f in /etc/iptables/include.d/*
 . $f
done

ドットと%fの間のスペースに注意してください

Saurabhは正しいです-これは意図したとおりに機能する必要はありませんが、10-xxx、20-yyyなどの命名規則を使用すると管理しやすい場合があります。

3
pQd

Bashで単純な関数を定義できます。

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

その後:

include some_dir/*

あるいは:

include some_dir/*.conf
2
user13185

テンプレートファイルからiptablesスクリプトを作成することも検討できます。その1つが元のiptablesスクリプトです。関連するディレクトリ内のテンプレートファイルを読み取り、それらから新しいiptablesスクリプトを作成するスクリプトを作成します。そうすれば、変更を加える必要がある場合は、テンプレートで変更を行い、スクリプトジェネレーターを再実行するだけです。

この方法を使用すると、基本テンプレートに派手なマーカーを配置して、テンプレートツリーの特定のディレクトリのファイルをいつ含めるかを通知することもできます。

2
John Gardeniers

Iptables構成にファイルを含めることはできないと思います。ファイアウォールルールは、記述された順序に大きく依存するため、この選択は理にかなっています。フォルダにファイルを含めるだけの場合、iptablesは最初に配置するルールと後で配置するルールを認識しません。

0

空のディレクトリで適切に動作するにはinclude.d/ できるよ:

for f in /etc/iptables/include.d/*; do
  [[ -e "${f}" ]] && . "${f}"
done
0
keypress