2017-03-24 14 views
2

Fail2Banの自動インストールと設定用のスクリプトを書くには、/etc/fail2ban/jail.localを変更する方法が必要です。私の問題は、ファイルの特定のセクションに行を追加する必要があるということですが、領域内にパターンenabled = trueが存在しない場合に限ります。 enable = trueを書くべきではない他の領域があります。sed/awkは2つのマッチの間に行を挿入しますが、他のパターンがない場合のみ

次SEDSが正常に動作しますが、enabled = trueがすでに存在しているかどうかをチェックしません:

sed '/\[apache-auth\]/{x;s/.*/./;x};/port/{x;/^.$/{x;s/^/enabled = true\n/;x};s/^/./;x}' -i /etc/fail2ban/jail.local 
sed '/\[apache-badbots\]/{x;s/.*/./;x};/port/{x;/^.$/{x;s/^/enabled = true\n/;x};s/^/./;x}' -i /etc/fail2ban/jail.local 
sed '/\[apache-noscript\]/{x;s/.*/./;x};/port/{x;/^.$/{x;s/^/enabled = true\n/;x};s/^/./;x}' -i /etc/fail2ban/jail.local 
sed '/^\[sshd\]/{x;s/.*/./;x};/port/{x;/^.$/{x;s/^/enabled = true\n/;x};s/^/./;x}' -i /etc/fail2ban/jail.local 

要求された情報

元のファイル

[sshd] 

port = ssh 
logpath = %(sshd_log)s 
backend = %(sshd_backend)s 

[apache-auth] 

port  = http,https 
logpath = %(apache_error_log)s 


[apache-badbots] 
# Ban hosts which agent identifies spammer robots crawling the web 
# for email addresses. The mail outputs are buffered. 
port  = http,https 
logpath = %(apache_access_log)s 
bantime = 172800 
maxretry = 1 


[apache-noscript] 

port  = http,https 
logpath = %(apache_error_log)s 

を追加するアップデート予想される出力

[sshd] 

enabled = true 
port = ssh 
logpath = %(sshd_log)s 
backend = %(sshd_backend)s 
# 
# HTTP servers 
# 

[apache-auth] 

enabled = true 
port  = http,https 
logpath = %(apache_error_log)s 


[apache-badbots] 
# Ban hosts which agent identifies spammer robots crawling the web 
# for email addresses. The mail outputs are buffered. 
enabled = true 
port  = http,https 
logpath = %(apache_access_log)s 
bantime = 172800 
maxretry = 1 


[apache-noscript] 

enabled = true 
port  = http,https 
logpath = %(apache_error_log)s 

英語ので、私のスペルミスを判断しないでください、私の母国ではありません。これがこの質問の正しいサイトであるかどうかもわかりません。

+1

入力ファイルと出力ファイルを貼り付けてください。 –

+0

@VIPINKUMAR入力ファイルと目的の出力を追加しました –

+1

サンプルをダウンロードした場合は、50行でなく15行と言います。それがあれば何とかなりますお客様の要件を理解する時間が大幅に短縮されます。いずれの方向にもスクロールバーが必要なときは、サンプルが大きすぎますので、もう一度[mcve](注** **最小**)を作成してみてください。 –

答えて

2

このあなたのために働くかもしれない(GNUのSED):

sed -nr '/^\[(apache-(auth|loadbots|noscript)|sshd)\]/{:a;x;/./!bb;/enabled = true/!s/^\w/enabled = true\n&/M;p;:b;x;h;d};H;$ba;d' file 

これはホールドスペース内のセクションを格納し、それがすでに存在してセクションをプリントアウトしていない場合、enabled = trueを挿入します。具体的には

command line switches-r-nは正規表現がより容易であるため、後者(grepのようなコマンドすなわちp又はPが存在しなければならない)前者およびオプション印刷に発現することを可能にする、活性化され

コマンドはif-then-elseで構成されています。

現在の行が[で始まり、]続く4つの単語、のいずれかを囲む場合は、{}間のコマンドが制定されます。

開始後の最初のコマンド{は、ファイルの終了条件が満たされたときに使用されるプレースホルダです。

xは、パターンスペース(PS)をホールドスペース(HS)に切り替えます。 Sedはtwo registersで、PSは現在の行(改行を引いたもの)がどこにあるかを示します。 HSはスペアレジスタであり、プログラマの裁量で使用されます。

次のコマンド/./!bbは、HSが空であるかどうかをチェックします(このコードが初めて実行された場合)。:bの名前空間にジャンプすると、次のコードが欠落します。

HSには1つ以上の行が含まれていることが分かっているので、これらの行に文字列enabled = trueが含まれているかどうかがチェックされ、そうでなければ文字列で始まる最初の行の文字列enabled = trueが挿入されます。

一致または不一致にかかわらず、HSはpコマンドで印刷されます。

支店名スペース

は今 :bをencountedされ、HSとPSが交換され、現在の行は、HS hにあり、その行の処理を終了 dを、削除何でも置き換えられます。

最初の正規表現は、失敗した場合:現在の行がHS Hに付加して、処理はコマンド$baによって名前空間:aに向けられた場合に最後の行でない限りdを削除します。これは、HS内の行が上記のように処理される必要があるファイルの終わりの状態をカバーします。

+0

ありがとうございますが、残念ながら、有効にする必要があるだけでなく、すべてのセクションに挿入しています。最小の例を作成するためにファイルの多くを少し切り取ったようです) –

+0

@SidneySeitz編集を参照してください – potong

+0

ありがとうございます。この文字列が正確に何をしているのか説明を追加できますか?私は初心者ですから、私はすべて理解していません –

0

awkレスキュー!

awk -v sections='sshd apache-auth apache-badbots apache-noscript' -v RS= -v ORS="\n\n" ' 
    BEGIN  {n=split(sections,a); 
       for(i=1; i<=n; i++) sec["["a[i]"]"]} 
    $1 in sec {$2 = "\nenabled = true\n"}1' file 

はセクション変数にタグを保持し、対応するセクションに必要な行を挿入します。セクションヘッダーが行の唯一のエントリであることを期待します。

関連する問題