15

サーバーのさまざまな側面を構成するための bash スクリプトを作成しようとしています。ここでのコンテキストは、conf ファイル (ini 形式) 内の変数の値を別の値に置き換えることです。

文脈は

[ssh-iptables]

enabled = false

false を true に変更するだけです。

通常、私は単純なビットでこれを行いますsed

sed -i 's/^enabled = false/enabled = true/g' /etc/fail2ban/jail.conf

しかしenabled = false、複数の場所に存在します。

使用awkしてみましたが成功しませんでした

awk -F ":| " -v v1="true" -v opt="enabled" '$1 == "[ssh-iptables]" && !f {f=1}f && $1 == opt{sub("=.*","= "v1);f=0}1' /etc/fail2ban/jail.conf

上記はこのフォーラムスレッドから提供されたものですが、スクリプトでそれを使用して機能させる方法について十分に理解していません。それがしているように見えるのは、cat /etc/fail2ban/jail.conf

これは大量のiniファイルで発生するため、理想的ではないかなり長い他のスクリプトをいくつか見つけました。誰かが上記のコードを修正するか、正しい方向に向けてくれることを願っています。

これがServerFaultに属している場合は申し訳ありませんが、サーバー構成自体の複雑さではなくスクリプトであるため、ここで考えた方が適切かもしれません.

4

4 に答える 4

24

[ssh-iptables]あなたのフォーマットがセクション内に角かっこの行(のような)がないと仮定すると、上記のソリューションを(でsed)使用しますが、次のようにクエリをそのブロック内に制限します。

sed -i '/^\[ssh-iptables\]$/,/^\[/ s/^enabled = false/enabled = true/' /etc/fail2ban/jail.conf

先頭の余分な部分は、次の置換ステートメントに、で始まる行と .[ssh-iptables]で始まる次の行の間でのみ実行するように指示します[。境界を示すコンマで区切られた 2 つの正規表現を使用します。

于 2013-06-07T15:30:23.153 に答える
12

外部アプリケーションの使用にオープンである場合は、 の使用に興味があるかもしれませんcrudini

例:

[oauth2provider]
module = SippoServiceOAuth2Provider
backend[] = none
wiface = public

; [calldirection]
; module = SippoServiceCallDirection
; backend[] = none
; wiface = internal

標準の grep は、コメント化された例外をフィルタリングしません。

crudiniコンサルティング用のものを使用すると、設定と変更が簡単になります。

$ crudini --get /myproject/config/main.ini oauth2provider wiface
public
$ crudini --get /myproject/config/main.ini calldirection wiface
Section not found: calldirection

私は bash のみのアプリを使用していましたが、このアプローチに移行しました。ただの提案です。

よろしく、

于 2016-05-04T12:04:23.220 に答える
3

この場合、sed の代わりに m4 を使用することを検討してください。これは変数置換を使用しており、ファイルが読みやすいように見えると思います。m4 テンプレートは次のようになります。

[ssh-iptables]
enabled=SSH_IPTABLES_ENABLED

ここで、次のパラメーターを使用して m4 を呼び出します (bash スクリプトから呼び出すことができます)。

m4 -DSSH_IPTABLES_ENABLED=true input.m4 > output.ini

また:

m4 -DSSH_IPTABLES_ENABLED=false input.m4 > output.ini

これは、m4 を使用する非常に単純な方法です。これについて読めば、いくつかの本当に気の利いたことができることがわかるでしょう (これは、autoconf/automake が最初に設計されたインフラストラクチャです)。

于 2013-06-07T15:30:56.517 に答える
1
awk '/^[ssh-iptables/ {ok=1}
     ok==1 && $0="enabled = false" {print "  enabled = true"; ok=0 ; next}
     {print $0} ' infile > tmp
     mv tmp infile
于 2013-06-07T15:30:21.177 に答える