如何比较ssh?


175

如果唯一可用的连接是ssh,如何在机器之间比较文件/文件夹?


8
#16661有一个相对类似的问题:如何区分两个RedHat Linux服务器?。此处的答案用于保存点击次数,rsync -ani --delete / root@remotehost:/但是完整答案提供了更多细节。
Owen Blacker '02

这里有很多答案,但是哪种方法更快?
pl1nk 2012年

Answers:


150

您可以使用Bash的流程替换来做到这一点:

 diff foo <(ssh myServer 'cat foo')

或者,如果两者都在远程服务器上:

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

12
是的,类似这样,但用于目录:)
Alexey Timanovsky 09年

您是如何表示目录的,总是可以用ls代替cat
Kyle Brandt

27
我怀疑“用于目录”意味着进行递归比较
Ian Clelland 2009年

9
我发现如果我的远程主机需要密码,则该技术对我不起作用。密码提示似乎不能很好地用于重定向,并且无法成功完成。如果您使用ssh键,这应该不是问题。
亚当·佛朗哥2012年

2
这是解决许多问题的很好的通用解决方案。可以使用'find / foo / bar -type f |代替'cat foo'。在读取文件时;做回声“ **** $文件”; 猫“ $文件”; 完成”,您将获得要比较的文件名和文件内容的列表。
Paul Gear

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
那目录呢?:)
Perlnika

1
这是一个示例:vimdiff .bash_profile scp://vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar 2014年

4
//之后的2个斜线remotehost很重要。单斜杠将不起作用
Lee Chee Kiam 2014年

2
如果远程主机上的用户名与当前主机上的用户名不同,则可以使用vimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC,2014年

如何使用两个具有id_rsa密钥文件@JaredC的远程主机执行此操作?
Manatax

61

如果您只想查看哪些文件不同,而不是查看实际文件的差异,则可以使用 rsync --dry-run


10
rsync -n是简短版本。
volni 2012年

很好-如果您需要使用其他端口,请使用rsync -e“ ssh -p 2222” <SRC> <DST>
Samoth

16

这是另一个又快又脏的命令行食谱。与选择的答案不同,它可以在makefile中使用:

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

如果我的编辑没有通过:此方法优于所选答案,因为它可以与Makefiles一起使用。
克里斯·雷德福

@Steve Dickinson-“它在makefile中起作用”是什么意思?
Martin Vegter 2014年

1
如果您像我一样遭受vim过敏,这也是一个不错的解决方案。:)我创建了一个bash脚本,用于比较两个不同主机上的相同文件,这在机器之间迁移服务和比较配置文件时很有用。参见gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

使用scp将文件带到普通计算机上并在其中进行比较?

或者,如果您只是想知道文件是否不同,请在每台计算机上使用md5sum对其进行哈希处理。

您也可以研究SSHFS之类的东西,但我不知道diff这样的算法在此方面的表现如何。


2
查看文件是否不同的更简单方法是rsync --dry-run
杰拉德·库姆斯

我忘记了SSHFS。这对我来说非常
有用

7

一种可能的方法是,简单地使用sshfs挂载远程文件系统。


diff通常是一次性操作,例如检查配置差异。每次都可以挂载文件系统,但并不方便。我最好是tar和scp。
2009年

3

您可以rsync在空运行模式下使用,如另一个答案中简短建议的那样。它列出了所有不同的文件。

为此,请使用rvnc选项(r=递归,v=详细,n=空运行,c=校验和)。与rsync在拉模式(rsync [OPTION...] [USER@]HOST:SRC... [DEST]),一个例子是:

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

请记住,这不会提供有关本地文件还是远程文件较新的信息。就算它们不同。


2
  • 在本地计算机上,对要比较的目录进行递归复制。例如:

    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 / dir / dir1的路径/ 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”(或其他不受ssh限制的通信)建立的隧道上的NFS。


1

您还可以尝试通过创建bash函数(可能在〜/ .bashrc中)来推广该方法:

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

然后使用如下构造调用它:

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

通过使用-s调用diff,这还将报告文件是否相同。

干杯! 吉姆

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.