サーバセットアップ

ここ一週間ほどシェルスクリプトを書いてる。

何故か

というのも自宅のサーバがDOS系の攻撃を受けてたので、
それを防ぐ為にセキュリティ関連のサービスを導入。

元々、セキュリティ関連は何も入れてなかったんだけど、(ファイアウォールすら)
既に乗っ取られてる可能性もかなりありそう。
なので少し前に構築したばかりだけど、
もっかい一から構築する事にしたんだ。

構築するにあたって毎回手作業でやるのも面倒臭いから、
作業を自動化する為のシェルスクリプトを作る事に・・・
ってのが事の発端。

とりあえず

OSはLinuxのCentOS5.0
bashを使う事に。
シェルなんてしばらく書いた事ないから、
文法が全然わからん。

変数の宣言から調べないと。。。

シェルから別のシェル呼び出し

少し詰まったけど、よく考えたら普通に
ファイル呼び出してやれば動くよね。シェルだから。
これがDOSバッチだとcallとかせにゃいかんけど。

ちなみに変数は別のシェルに引き継ぎたい場合、
exportを使って環境変数として宣言してやる。

設定ファイルをシェル内からヒアドキュメント形式でエクスポート

サービスの設定ファイル(mysqlだとmy.conf等)を、
予め実行シェルから相対位置に置いておき、
以下のようにシェルの中で cp によりコピーしてやってもいいが

cp my.conf /etc/my.conf

シェルの中に記述してしまいたい。(まぁ保守性は落ちるけど)


以下のように書く事で出来た。

cat > /etc/my.conf << _EOS_
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
old_passwords=1
default-character-set = utf8
_EOS_

ヒアドキュメントより入力した内容をcatで
ファイルにリダイレクトしているだけ。


但し気をつけないといけないのが変数の扱い。
設定ファイルに変数を書きたい場合。
例えばpostfixのmain.cfに

myorigin = $mydomain

と書きたい場合、ヒアドキュメント内でそのまま書くと
$mydomainの部分がシェルの変数だと判断してしまうので、
出力されたmain.cfには変数の値に置き換えられて出力される。
この場合、シェルの中ではmydomainという変数が宣言されてないので、

myorigin =

と空のデータとして出力される。
これを防ぐにはヒアドキュメント内の$の前に\(バックスラッシュ)をつけて
エスケープしてやる必要がある。