it-swarm.cn

如何比较ssh?

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

180
Alexey Timanovsky

终于,我找到了一个很好的解决方案: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
Alexey Timanovsky

您可以使用Bash的 进程替换 来完成:

 diff foo <(ssh myServer 'cat foo')

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

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

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

62
Rory

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

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

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

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

您也可以查看 [〜#〜] sshfs [〜#〜] 之类的内容,但我不知道diff这样的算法在此方面的表现如何。

10
Ian Clelland

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

7
Zoredache

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

为此,请使用rvnc选项(r =递归,v =详细,n =空运行,c =校验和)。在rsync处于拉动模式下(rsync [OPTION...] [[email protected]]Host:SRC... [DEST]),例如:

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

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

3
zzapper

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

mkdir remote_path
sshfs [email protected]:/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

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

myrdiff() { ssh [email protected]"$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到远程服务器,并在出现提示时输入我的用户名/密码。然后,我使用diff命令在主目录的.gvfs目录中创建的目录。

diff -r --brief/home/user dir/.gvfs/SFTP\on\freenas.local/dir/dir1的路径/ 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