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

评论

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

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

没人使用视觉差异工具吗?

#1 楼

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

 diff foo <(ssh myServer 'cat foo')


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

评论


是的,类似这样,但对于目录:)

–阿列克谢·蒂曼诺夫斯基(Alexey Timanovsky)
09年8月26日在17:29

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

–凯尔·勃兰特(Kyle Brandt)
09年8月26日在17:29

我怀疑“对于目录”意味着进行递归比较

–伊恩·克莱兰德
09年8月26日在17:36

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

–亚当·佛朗哥(Adam Franco)
2012年1月24日14:28

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

– Paul Gear
2014年11月11日在22:22

#2 楼

最后,我找到了一个很好的解决方案: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。

评论


那目录呢? :)

– Perlnika
2013年12月16日16:13



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

–vaichidrewar
2014-02-19 22:56

//在remotehost很重要之后,加2斜杠。单斜杠不起作用

–李志坚
2014年4月7日在2:05

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

– JaredC
2014年5月19日15:21

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

–Manatax
15年3月12日在18:01

#3 楼

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

评论


rsync -n是简短版本。

– volni
2012年1月3日23:48

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

–萨莫斯(Samoth)
15年7月12日在6:22

#4 楼

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

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


评论


如果我的编辑没有通过:此方法优于所选答案,因为它可以与makefiles一起使用。

–克里斯·雷德福(Chris Redford)
2013年9月13日在21:36

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

–马丁·维格特(Martin Vegter)
2014年5月25日13:43

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

–詹纳克
16-10-14在9:09



如果您的远程主机需要密码,此解决方案也可以使用。

–ishmael
6月29日0:33

#5 楼



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

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

评论


rsync --dry-run是查看文件是否不同的更简单方法。

–通用梳子
09年8月26日在20:18

我忘记了SSHFS。这对我来说很棒

–香精
2014年9月17日下午16:36

#6 楼

一种方法是,如果可能的话,只需使用sshfs挂载远程文件系统。

评论


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

–阿列克谢·蒂曼诺夫斯基(Alexey Timanovsky)
09年8月26日在17:28

#7 楼

您可以在空运行模式下使用rsync,如另一个答案中简要建议的那样。它列出了所有不同的文件。为此,请使用rvnc选项(r =递归,v =详细,n =空运行,c = checksum)。在rsync处于拉模式(rsync [OPTION...] [USER@]HOST:SRC... [DEST])的情况下,示例为:就算它们不同。

#8 楼

在本地计算机上,

递归复制要比较的目录。例如:

cp -R dir replica



使用rsync在本地副本上复制远程目录:

 rsync remote:/path/to/dir replica



使用diff查找远程目录的本地目录和本地副本之间的差异:

diff dir replica




#9 楼

如果您有sshfs,并且需要比较目录:

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


#10 楼

这是我的操作方法。

我使用SFTP到远程服务器,并在出现提示时输入我的用户名/密码。
然后我使用了在.gvfs目录中创建的目录diff命令中的主目录。

diff -r --brief / home / user dir / .gvfs / SFTP \ on \ freenas.local / dir / dir1的路径/ local dir / dir2的路径

#11 楼

这是一个可以帮助区分本地文件夹和远程文件夹的脚本。:

 #!/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


#12 楼

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

” | | sed's /> // g'

#13 楼

使用跨ssh挂载的sshfs。并不会很快,但是您可以使用全套工具来期望所有内容都在本地文件系统上。另一种选择是通过“ ssh -w”(或其他不受ssh限制的通信)建立的隧道上的NFS。

#14 楼

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

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


,然后使用类似以下的构造调用它:

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


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

干杯!吉姆

#15 楼

使用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 root@172.16.98.130 'cat /etc/ssh/keys-root/authorized_keys')


检查grep命令的成功状态

echo $?
# 0


使用此思想来设置SSH无密码登录:

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

ssh root@172.16.98.130


注意:
请确保已安装sshpass软件包,以便非交互地将密码传递给ssh命令。

评论


sshpass在您的日志中保留未加密的密码。我不会在生产中使用它。设置用于登录的SSH密钥。

–马克·斯图尔特
3月9日15:24