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

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

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

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

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

20150311_000001

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)

20150311_000002

 

Sponsored Links

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

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

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

20150311_000003

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 ポート番号" ユーザ名@ホスト名:/対象ディレクトリ /対象ディレクトリ

20150311_000004

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)
Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。