sshでdiffを実行する方法は?


175

使用可能な接続がsshのみである場合、マシン間でファイル/フォルダーを比較するにはどうすればよいですか?


8
#16661には比較的似た質問があります。2つのRedHat Linuxサーバーを比較するにはどうすればよいですか?。そこの答えは、クリックを保存するためですrsync -ani --delete / root@remotehost:/、完全な答えはより詳細を提供します。
オーウェンブラッカー

ここでは非常に多くの回答がありますが、どちらのアプローチが速いですか?
pl1nk

回答:


150

あなたはBashのプロセス置換でそれを行うことができます:

 diff foo <(ssh myServer 'cat foo')

または、両方がリモートサーバー上にある場合:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')

12
ええ、このようなものですが、ディレクトリのために:)
Alexey Timanovsky 09

ディレクトリの意味を教えてください。常にcatをlsに置き換えることができます
カイルブラント

27
「ディレクトリ用」は再帰的な差分を実行することを意味すると
思う

9
リモートホストでパスワードが必要な場合、この手法は役に立たないことがわかりました。パスワードプロンプトはリダイレクトではうまく機能しないようで、正常に完了できませんでした。sshキーを使用する場合、これは問題になりません。
アダムフランコ

2
これは、多くの問題に対する優れた一般的なソリューションです。「cat foo」の代わりに、「find / foo / bar -type f | ファイルの読み取り中。echo "**** $ file"; cat "$ file"; これで、ファイル名とファイルの内容のリストをdiffに保存できます。
ポール・ギア

106

最後に、私は素晴らしい解決策を見つけました:vimdiff

vimdiff /path/to/file scp://remotehost//path/to/file

http://linux.spiney.org/remote_diff_with_vim_and_sshのおかげで、http://www.vim.org/scripts/script.php script_id = 1075参照してください


7
ディレクトリはどうですか?:)
ペルニカ

1
次に例を示します。vimdiff .bash_profile scp://vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar

4
//後の2つのスラッシュremotehostは重要です。シングルスラッシュは機能しません
リーチーキアム14

2
リモートホスト上に現在のホストとは異なるユーザー名がある場合は、次を使用しますvimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC

id_rsaキーファイル@JaredCを持つ2つのリモートホストでこれをどのように行うことができますか?
マナタックス

61

実際のファイルの差分ではなく、どのファイルが異なるかだけを確認したい場合は、次を使用できます。 rsync --dry-run


10
rsync -nは短いバージョンです。
-volni

グレート-あなたが別のポートを使用する必要がある場合は、使用のrsync -e "のssh -p 2222" <SRC> <DST>
サモス

16

ここに、もう1つの簡単で汚いコマンドラインレシピを示します。選択した答えとは異なり、メイクファイル内で機能します。

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"

私の編集が通らない場合:この方法は、メイクファイルで機能するため、選択した答えよりも優れています。
フォード

@Steve Dickinson-「メイクファイル内で動作する」とはどういう意味ですか?
マーティンベグター

1
あなたが私のようなウイルスアレルギーに苦しんでいる場合、これも良い解決策です。:) 2つの異なるホスト上の同じファイルを比較するbashスクリプトを作成しました。マシン間でサービスを移行し、構成ファイルを比較するときに役立ちます。gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

scpを使用してファイルを一般的なマシンに持ち込んで、そこに差分を作成しますか?

または、ファイル異なるかどうかだけを知りたい場合は、各マシンでmd5sumでハッシュします。

SSHFSのようなものを調べることもできますが、diffのようなアルゴリズムがどの程度うまく機能するのかわかりません。


2
ファイルが異なるかどうかを確認する簡単な方法はrsync --dry-runです。
ジェラルドコームズ

SSHFSを忘れていました。これは...私のために素晴らしい仕事
のaroD

7

1つの方法として、システムで可能な場合は、単にsshfsを使用してリモートファイルシステムをマウントします。


diffは通常、構成の違いをチェックするようなワンショットアクションです。毎回ファイルシステムをマウントすることは可能ですが、便利ではありません。タールとscpの方が良いでしょう。
アレクセイ・ティマノフスキー2009

3

別の回答でrsync簡単に提案されているように、ドライランモードで使用できます。異なるファイルがリストされます。

そのためには、rvncオプション(r= recursive、v= verbose、n= dry-run、c= checksum)を使用します。プルモードrsyncrsync [OPTION...] [USER@]HOST:SRC... [DEST])では、例は次のとおりです。

rsync -rvnc root@182.18.158.207:/var/www/html/dev/ .

覚えておいて、これはローカルまたはリモートのファイルが新しいかどうかに関する情報を提供しません。それらが異なる場合。


2
  • ローカルマシンで、diffするディレクトリの再帰コピーを作成します。例えば:

    cp -R dir replica
    
  • rsyncを使用して、ローカルコピーを介してリモートディレクトリを複製します。

     rsync remote:/path/to/dir replica
    
  • diffを使用して、ローカルディレクトリとリモートディレクトリのローカルレプリカの違いを見つけます。

    diff dir replica
    

2

sshfsがあり、ディレクトリを比較する必要がある場合:

mkdir remote_path
sshfs user@host:/path/ remote_path
diff -r path remote_path

1

これが私がやった方法です。

リモートサーバーへのSFTPを使用し、プロンプトが表示されたらユーザー名/パスワードを入力しました。次に、diffコマンドでホームディレクトリの.gvfsディレクトリに作成されたディレクトリを使用しました。

diff -r --brief / home / user dir / .gvfs / SFTP \ on \ freenas.local / path to dir / dir1 / path to local dir / dir2


1

これは、ローカルフォルダーとリモートフォルダーを比較するのに役立つスクリプトです。

 #!/bin/bash

 LOCALFOLDER=/var/www/tee
 REMOTEFOLDER=$(ssh root@111.111.111.1 'ls -lA /hfs/tee'| grep -E '^total' | cut -d " " -f 2 > remotessh.txt)
 COMMAND=$(ls -lA $LOCALFOLDER | grep -E '^total' | cut -d " " -f 2 > localssh.txt)
 REM=$(cat remotessh.txt)
 LOCAL=$(cat localssh.txt)

 echo $LOCAL
 echo $REM

 if [ $REM -eq $LOCAL ]
 then
      echo Directories are the same
 else
      echo Directories are differnt
 fi

 #diff localssh.txt remotessh.txt | grep -E '^total' | cut -d " " -f 2


1

ssh全体にマウントされたsshfsを使用します。それほど高速ではありませんが、すべてがローカルファイルシステム上にあることを期待するツールの完全なスイートを使用できます。別の方法は、「ssh -w」で作成されたトンネルを介したNFS(またはsshが制限ではない他の通信)です。


1

〜/ .bashrcにbash関数を作成して、アプローチを一般化することもできます。

myrdiff() { ssh root@"$1" cat "$2" | diff -s - "$2" ; }

次に、次のような構造で呼び出します:

myrdiff vm20-x86-64 /etc/gdm/Init/Default

-sを指定してdiffを呼び出すと、ファイルが同一かどうかも報告されます。

乾杯!ジム

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.