4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Linux】 別サーバーにあるファイルをサーバ間で差分をみる(diffする)方法

Last updated at Posted at 2019-04-24

サーバー間のファイルの差分を取るの方法

サーバー間にあるファイルの差分を見たいときってありますよね?

例えば開発機と本番機のファイルで差分が無いかとか、
正副サーバーでファイルに差分がないか? とかの時とか、

そういった際にいちいち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 ライフを!

(最後まで読んでいただいた方.. よろしかったら いいね 頂けるととても嬉しいです)

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?