サーバー間のファイルの差分を取るの方法
サーバー間にあるファイルの差分を見たいときってありますよね?
例えば開発機と本番機のファイルで差分が無いかとか、
正副サーバーでファイルに差分がないか? とかの時とか、
そういった際にいちいちscpとかでファイルをコピーしてdiffするのはめんどくさいです。
そこで、一度にできるコマンドとサンプルコードを紹介します。
前提
- server1は/etc/hostsに記載されいてるサーバ名もしくはIPアドレス
- ssh はauthorized_keys等に設定済みで ssh [サーバー] でログイン可能であること
※鍵認証とか必要であればssh のところを適時修正してください。
ほか様のサイトですが、 ここ が参考になりました。 (※パスワードとかが聞かれないこと)
コマンド
ここでは/etc/hostsのファイルを比較しています
## (例)
server1="hogeserver" # または192.168.xx.xxとか
server2="fugaserver"
file="/etc/hosts"
diff <(ssh $server1 cat $file ) <(ssh $server2 cat $file)
解説
<( コマンド )
これは標準出力をファイルとして扱う方法です。
システム領域にファイルとして保存されて、実行後に消えます。
(※すいません間違っているかもしれませんが、言いたいことはユーザーが意識しなくていい領域という事です)
応用編
通常は、ファイルリストとか使ってループで回しますよね?
下記は参考までにどうぞ。
#!/bin/bash
# 対象サーバーを設定
server1="hogeserver" # または192.168.xx.xxとか
server2="fugaserver"
## 対象ファイルリストを作成
## LIST=$(cat /home/test/filelist.txt) とかでもOK
LIST="
/etc/hosts
/home/test/aaa
/home/test/bbb
"
## ログをファイル指定
log=/home/test/${0}.log
## ログのクリア
:> ${log}
for file in $LIST
do
## echoは、結果を見やすくするために入れておいたほうがいいです
echo "### diff <(ssh $server1 cat $file ) <(ssh $server2 cat $file) " >> ${log}
diff <(ssh $server1 cat $file ) <(ssh $server2 cat $file) >> ${log}
## exit ## ループするなら、全loopする前に一度ここでexitさせておいて確認したほうがいいですよw
done
exit 0
こんな感じで自動化だ〜
それでは良い Linux ライフを!
(最後まで読んでいただいた方.. よろしかったら いいね 頂けるととても嬉しいです)