ssh経由でディレクトリにあるファイルの差異を確認する

時には、ssh越しにディレクトリの中にあるファイルに差異が無いかを確認したいときもある。
今回は、そんな時に使える確認方法について記述する。

1.diffコマンドで確認する

公開鍵認証でのログイン設定が行われている(もしくは、sshpassコマンドが導入されている)ようならば、diffコマンドで差異を確認することができる。
以下のようにコマンドを実行することで、ローカル、リモートどちらかで足りないファイルを確認する。

diff <(ssh ユーザ名@ホスト名 'find /確認するPATH -type f | sort') <(find /確認するPATH -type f | sort)

test@test-vm-ubuntu:~$ ssh root@192.168.0.240 find /work -type f | sort
/work/aaaaa
/work/test/20141207/messages
/work/test/aaa.txt
/work/test/previous/Rev_1.0_v41.BIN
/work/test/previous/Rev_2.5_v66.BIN
/work/test/previous/previous
/work/test/previous0.3.linux32.tar.gz
/work/test/previous0.3.linux32.tar.gz.1
/work/test/test.sh
/work/test/test.txt
/work/test/test1.sh
/work/test/test1_.sh
/work/test/test2.sh
/work/test/test2.txt
/work/test/test3.sh
/work/test/test4.sh
/work/test/test5.sh
/work/test/winexe_1.00.1-1_amd64.deb
/work/test_/test.sh
/work/test_/test.txt
/work/test_text
/work/work/test/20141207/messages
/work/work/test/test.sh
/work/work/test/test.txt
/work/work/test/test2.sh
/work/work/test/test2.txt
test@test-vm-ubuntu:~$ find /work -type f
/work/test_/test.txt
/work/test_/test.sh
/work/work/test/test2.txt
/work/work/test/test2.sh
/work/work/test/20141207/messages
/work/work/test/test.txt
/work/work/test/test.sh
/work/test/previous/previous
/work/test/previous/Rev_2.5_v66.BIN
/work/test/previous/Rev_1.0_v41.BIN
/work/test/test2.txt
/work/test/test4.sh
/work/test/winexe_1.00.1-1_amd64.deb
/work/test/test5.sh
/work/test/aaa.txt
/work/test/previous0.3.linux32.tar.gz
/work/test/test1.sh
/work/test/test2.sh
/work/test/previous0.3.linux32.tar.gz.1
/work/test/20141207/messages
/work/test/test1_.sh
/work/test/test3.sh
/work/test/test.txt
/work/test/test.sh
/work/test_text
test@test-vm-ubuntu:~$ diff <(ssh root@192.168.0.240 find /work -type f | sort) <(find /work -type f | sort)
1d0
< /work/aaaaa

確認を行うディレクトリのPATHがサーバごとで違うならば、以下のように実行する。

diff <(ssh ユーザ名@ホスト名 'cd /確認するPATH; find ./ -type f | sort') <(cd /確認するPATH; find ./ -type f | sort)

2.diffコマンドで確認する(ASCIIファイルの中身)

ASCIIファイルの中身の差異を確認するならば、diffコマンドとssh、そしてgrepを組み合わせると良いだろう。

diff <(ssh ユーザ名@ホスト名 'cd /確認するPATH; grep -Rn "" ./ | sort') <(cd /確認するPATH; grep -Rn "" ./ | sort)

test@test-vm-ubuntu:~$ diff <(ssh root@192.168.0.240 'cd /work;grep -Rn "" ./ | sort') <(cd /work;grep -Rn "" ./ | sort)
76,77c76
< ./test_text:3:aaaaaaaaaa
< ./test_text:4:AAAA5678 --- > ./test_text:3:AAAA5678

3.rsyncコマンドを用いる

さて、diffコマンドを利用した方法は公開鍵認証を用いるなど、パスワード無しでのログインを行える必要がある。
この設定がされていない環境の場合、rsyncが有るようであればこれを用いるのが現実的だろう。

rsyncコマンドで、ssh経由でディレクトリの差異を確認する場合、以下のようにコマンドを実行する。

rsync --checksum --dry-run -rvce "ssh -p ポート番号" ユーザ名@ホスト名:/対象ディレクトリ /対象ディレクトリ

test@test-vm-ubuntu:~$ rsync --checksum --dry-run -rvce "ssh -p 22" root@192.168.0.240:/work /work
receiving incremental file list
work/vbvvvv
work/test/test1.sh

sent 28 bytes  received 1,017 bytes  2,090.00 bytes/sec
total size is 1,621  speedup is 1.55 (DRY RUN)