findコマンドにて更新日が最近のファイルを検索する

カレントディレクトリ内で更新日が最近の5日以内のファイルを見つける。-lsで詳細情報を付加。

find . -mtime -5 -ls

更新日が最近の5日以上前のファイルを見つける(こう書くと古い方を見てしまう)

find . -mtime +5

更新日がちょうど5日前のファイルを見つける

find . -mtime 5

引数が可変の場合の処理の仕方

引数が可変のとき

shiftコマンドを使用することで、シェルの引数を順に第一引数として呼び出すことができます

shiftコマンドとは

引数を1つずらす。
シェル・スクリプトに与えられた引数を1つずつ処理したい場合に役立つ。shiftの後に自然数Nを指定すると,その数だけ引数をずらす。つまりN+1番目の引数が最初の引数となる。

サンプルスクリプト(shift.sh)
#!/bin/sh

for i in `seq 1 ${#}`    #引数の数だけループさせる
do
    echo ${1}            #第一引数を表示
    shift                #shift(ずらす)
done
実行結果
[tomozo@CentOS ~]$ ./shift.sh                         #引数が無い場合は何もしない
[tomozo@CentOS ~]$ ./shift.sh 1                       #引数が1個だけの場合は、1個だけ表示
1
[tomozo@CentOS ~]$ ./shift.sh 1 hoge "hogehoge"       #引数が3個の場合は3個表示して終了
1
hoge
hogehoge
[tomozo@CentOS ~]$ ./shift.sh 1 2 3 4 5 6 7 8 9 10    #引数が10個の場合は10個表示して終了
1
2
3
4
5
6
7
8
9
10
[tomozo@CentOS ~]$ 

MySQL Slave再構築

とあるクラウド上で、MySQLのMaster-Slave構成を組んでいるが、あるときSlaveサーバが載っているホストがダウンしたらしく、Slaveサーバもダウンした。
めでたく別ホスト上に自動で立ち上がってきたのだが、ブチッと切れたのでレプリケーションエラーが発生していた。よってSlaveを再構築することになった。

作業その前に

作業完了後は以下の確認をしたいため準備しておくこと。

  • dabatase、table、データ(サンプル)の数が一致すること
  • Master で create dabase をして、 Slaveに伝播されること
  • Slave を restart してもレプリケーションが正しく動作すること
  • MySQLのエラーログにエラー等が出ないこと

Master で dump を取得

mysqldump -u root -p --opt --single-transaction --master-data --all-databases > /tmp/Master-alldatabases.dmp.`date +%Y%m%d`

ポジションの取得

後ほどSlaveの設定をする際に、ポジションの情報が必要なので、上記手順で取得した dump から MASTER_LOG_FILE 、 MASTER_LOG_POS を確認しメモしておく。

grep -i 'CHANGE MASTER TO' /tmp/Master-alldatabases.dmp.`date +%Y%m%d`
-----
CHANGE MASTER TO MASTER_LOG_FILE='binary_log.000044', MASTER_LOG_POS=117069861;

Slave へ dump を転送

手順は略。環境によって具合良くやってください。

Slave で MySQL のデータをバックアップ(念のため)

cd /var/lib
tar zcvf mysql.tgz mysql/

slave の設定を削除

reset slave all;

slave status も Empty となり、 relay_log もリセットされる。

Slave に Master の Dump を投入

mysql -u root -p <  /tmp/Master-alldatabases.dmp.`date +%Y%m%d`

Slave 設定

CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='slave_user',
MASTER_PASSWORD='slavepasswd',
MASTER_LOG_FILE='binary_log.000044',
MASTER_LOG_POS=117069861;
-----
start slave ;

Sorryサーバなどで 503 ページを出す際の注意点

sorryサーバ等で 503ページ を出力する際、そのページが css や画像を使っているのであれば、全てのリソースファイルを RewriteRule 対象外にする必要がある。

ErrorDocument 503 /sorry.html

RewriteEngine on
RewriteCond %{REQUEST_URI} !=/sorry.html
RewriteCond %{REQUEST_URI} !=/resource/css/base.css
RewriteCond %{REQUEST_URI} !=/resource/css/layout.css
RewriteCond %{REQUEST_URI} !=/resource/images/logo.png
RewriteRule ^(.*)$ - [L,R=503]

systemd でよく使うコマンド

CentOS7になってから、否が応でもsystemdを使わなければならなくなりました…。
ので、特に使いそうなコマンドをメモっておきます。

【一覧】
操作内容 SysVinit Systemd
起動 /etc/init.d/sshd start systemctl start sshd
終了 /etc/init.d/sshd stop systemctl stop sshd
強制終了 PID探してkill -9 systemctl kill -s 9 sshd
再起動 /etc/init.d/sshd restart systemctl restart sshd
設定反映 /etc/init.d/sshd reload systemctl reload sshd
状態取得 /etc/init.d/sshd status systemctl status sshd
自動起動を有効 chkconfig sshd on systemctl enable sshd
自動起動を無効 chkconfig sshd off systemctl disable sshd
自動起動の状態確認 chkconfig --list systemctl list-unit-files
自動起動の状態確認 chkconfig --list sshd systemctl is-enabled sshd
サービス一覧の表示 ls /etc/init.d systemctl --type service
【その他】

自動起動一覧表示

systemctl list-unit-files|grep '\.service *enabled'

ScpOnlyの設定方法

scponly ではなく、 OpenSSH の設定で実現します。
以前は scponly で実現をしていましたが、OpenSSH 4.9 からは chroot の機能がビルトインされているので、 scponlyをインストールする必要はありません。

設定手順

OpenSSHの設定ファイル

onlyuser という名前のユーザーが SFTP で Apache の公開領域 (/var/www/) だけ操作できるように設定します。
まず /etc/ssh/sshd_config を変更します。SFTP の接続を処理するサブシステムを、標準の sftp-server から sshd 内部の internal-sftp に変更します。

#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

次に末尾に以下の 3 行を追加します。

Match User onlyuser
    ChrootDirectory /var/www
    ForceCommand internal-sftp

Match User は対象ユーザー、ChrootDirectory は許可するディレクトリを指定します。
ちなみに、ここでForceCommandで internal-sftpを指定してるから、上記の標準設定はいらないんじゃない?と思ったのですが、標準設定を変えないとうまくいきませんでした。

許可ディレクトリのパーミッション

ChrootDirectory で指定するディレクトリは root ユーザーだけが書き込みできる状態でなければなりません。所有者が一般ユーザーだったり、権限が 777 だと /var/log/secure に以下のようなエラーが吐かれます。

sshd[17779]: fatal: bad ownership or modes for chroot directory "/var/www"
sshd再起動

問題なければ上書きして sshd をリスタートします。これで設定完了です。
SFTP クライアントから接続すると /var/www/ 配下しか操作できないはずです。
また、ssh コマンドで接続すると以下のようなエラーになります。

$ ssh onlyuser@localhost
This service allows sftp connections only.
Connection to localhost closed.

パスワードを作成する

mkpasswd

パスワードを自動生成するためのコマンドです。
なおこのコマンドを使用するにはexpectパッケージがインストールされている必要があります。

mkpasswd -s 0 |sed -e "s/[1IlijO0o]/Z/g"

※紛らわしい文字が出た場合は "Z" に置換しています。

よく使うオプション
オプション デフォ値 説明
-l 9 生成されるパスワードの文字数
-d 2 パスワード中に含まれる数字の最低文字数を指定
-c 2 パスワード中に含まれる小文字の最低文字数を指定
-C 2 パスワード中に含まれる大文字の最低文字数を指定
-s 1 パスワード中に含まれる特殊文字の最低文字数を指定

findで容量の合計を出す

1年前~現在 までのファイルの合計容量(KB)
find ./ -mtime -365 -type f -printf "%s\n" |awk '{sum += $1; printf("\r%d",sum/1024) }; END{print""};'
1年前~現在 までのファイルの合計容量(MB)
find ./ -mtime -365 -type f -printf "%s\n" |awk '{sum += $1; printf("\r%d",sum/1024/1024) }; END{print""};'

秘密鍵公開鍵の作成

サーバ間でsshログインしたり、rsyncしたい時用に、サーバの秘密鍵公開鍵ペアを作成します。

ssh-keygen -t rsa -b 2048 -C {ユーザ名}@{ホスト名}

オプションの -t はタイプ。 -b はビット。 -C はコメント。