web-dev-qa-db-ja.com

sshをどのように比較しますか?

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

180

最後に私は素晴らしい解決策を見つけました: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 も参照してください。

108

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

 diff foo <(ssh myServer 'cat foo')

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

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
153
Kyle Brandt

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

62
Rory

次に、すばやく簡単なコマンドラインレシピを示します。選択した回答とは異なり、メイクファイル内で機能します。

ssh [login]@[Host] "cat [remote file]" | diff - "[local file]"
16
Steve Dickinson

Scpを使用してファイルを一般的なマシンに移動し、そこで差分を作成しますか?

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

[〜#〜] sshfs [〜#〜] のようなものを調べることもできますが、diffのようなアルゴリズムがそれに対してどの程度うまく機能するかはわかりません。

10
Ian Clelland

1つの方法として、システムで可能であれば、リモートファイルシステムを sshfs でマウントするだけです。

7
Zoredache

別の答え で簡単に提案されているように、rsyncを予行モードで使用できます。異なるファイルが一覧表示されます。

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

rsync -rvnc [email protected]:/var/www/html/dev/ .

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

3
zzapper

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

mkdir remote_path
sshfs user@Host:/path/ remote_path
diff -r path remote_path
2
metrix
  • ローカルマシンで、比較するディレクトリの再帰的なコピーを作成します。例えば:

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

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

    diff dir replica
    
2
salva

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

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

次に、次のような構成で呼び出します。

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

-sを付けてdiffを呼び出すと、ファイルが同一かどうかもレポートされます。

乾杯!ジム

1
Jim Swain

http://myfedora.co.za/2012/04/diff-two-remote-file-systems/

diff <(/ usr/bin/ssh [email protected] 'ls/opt/lib /')<(/ usr/bin/ssh [email protected] 'ls/tmp /')| grep -i ">" | sed 's /> // g'

1
Riaan

ここに私がそれをした方法があります。

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

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

1
Peter

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

 #!/bin/bash

 LOCALFOLDER=/var/www/tee
 REMOTEFOLDER=$(ssh [email protected] '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
stainless

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

1
Skaperen

grepを使用

remote ip: 172.16.98.130
remote file: /etc/ssh/keys-root/authorized_keys
local file: ~/.ssh/id_rsa.pub

grepを使用して、リモートファイルの内容をローカルファイルと比較します

grep -w "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected] 'cat /etc/ssh/keys-root/authorized_keys')

grepコマンドの成功ステータスを確認する

echo $?
# 0

このアイデアを使用して、パスワードなしのSSHログインを設定します。

if ! grep "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected] cat /etc/ssh/keys-root/authorized_keys) &>/dev/null; then
  cat ~/.ssh/id_rsa.pub | sshpass -p "mypassword" ssh [email protected] "cat >> /etc/ssh/keys-root/authorized_keys"
fi

ssh [email protected]

注:sshpassコマンドに非対話的にパスワードを渡すためにsshパッケージがインストールされていることを確認してください。

0
Sathish