CentOSのシェルスクリプトについて。


シェルスクリプトでサーバーを半自動設定したいと思います。
その際によく使われるコードの組み立て方を教えてください。


例としてメールサーバーだったら、
最初のインストールは、シェルスクリプトに、

 yum -y install postfix

と書けばいいと思うのですが、

「main.cf」等、設定ファイルの書き換え方などがわかりません。


具体的には、以下のようなことが必要だと思うのですが、どうすれば良いのでしょうか。

<シェルスクリプトでmain.cfを弄る時において>
・まずファイルを開く
・ある項目があるかないか、あってもコメントアウトされているかなどの判定。
・キーボードから対話的に入力しながら、「#myhostname」などのコメントを外して書き換え。
・ファイルの最終行へ必要項目を追加。


ほかにも、シェルスクリプトでのサーバー半自動設定によく使われる手法がありましたらお教えください。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/08/10 12:10:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:a-kuma3 No.1

回答回数4966ベストアンサー獲得回数2151

ポイント150pt

インストール後の処理は、ぼくなら、こう書くと思います。


  1. grep, sed, awk を使って、元の設定ファイルの内容を確認し、行の有無などをシェル変数に設定する
  2. 1. の結果をもとに、echo + read を使って、対話的に必要事項を入力させる(結果はシェル変数へ)
  3. sed, awk を使って、設定ファイルの内容を変更、追記する


雰囲気、こんな感じになるか、と。


DEF=/var/opt/○○/main.cf

#   内容を調べる
XXX=`grep .... $DEF`        # とか、

grep -q .... $DEF
XXX=$?                      # とか、

#   対話的に設定値を入力
if [ "$XXX" == "" ]
then
    echo ....
    read YYY
fi

#   設定ファイルを書き換え
mv $DEF ${DEF}.backup
cat ${DEF}.backup |\
sed -e "/xxxxx/s/xxxxx/yyyyy/" |\
   ...
awk '
    END {
        print "xxxxxx"
        print "xxxxxx"
            ...
    }
    ' > $DEF

実際には、適宜、書き換えの処理なんかを関数にしたりするとは思いますが。


ほかにも、シェルスクリプトでのサーバー半自動設定によく使われる手法がありましたらお教えください。

perl のスクリプトで、ガツンと書いちゃう人が多いかも。

その場合は、ほぼ普通のプログラムなので、質問にあるようにファイルをオープンして、

内容を読みこんで、などなど、というような感じになるでしょう。

定義ファイルを行単位の配列で、全部読み込んでおいて、

それをループを回しながら処理する、という感じでしょうね。

id:JULY No.2

回答回数966ベストアンサー獲得回数247

ポイント150pt

Postfix に限った話をすれば、postconf コマンドで main.cf の内容を書き換えられます。

Postfix manual - postconf(1)

例えば、

# postconf -e myhostname=mx.example.com

とすると、設定する行が無ければ追加され、既にあれば置き換えられます。


ただ、どんな設定ファイルでも使える手は、なかなか無いと思います。


一から作るとしたら、それぞれの設定ファイル用にテンプレートを作り、そのテンプレートを使ってキーワードを置き換えていく、というのが現実的かと思います。


実際に試した事は無いですが、Webmin のソースファイルは参考になるかもしれません。Webmin 自体は Perl で書かれた CGI プログラムの塊なので、そこから使えるところを探し出して使えば、出来るとは思います。ただし、かなり面倒だと思いますが(^^;。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません