如何通过ssh区分目录

时间:2014-01-07 10:22:24

标签: linux shell

我试图以递归方式将本地主机中的目录与远程linux机器中的目录进行比较。但是,当我执行下一个命令时:

diff -r 'ssh admin@10.0.0.10:/home/admin' /home/admin

它不起作用:

  

diff:ssh admin@10.0.0.10:/ home / admin:没有这样的文件或目录

以递归方式比较目录内容的正确方法是什么?

提前致谢

5 个答案:

答案 0 :(得分:40)

如果您不需要在文件中区分细节,只需获取目录/文件名的区别,然后尝试:

(注意:需要设置“无密码的SSH登录”,详情请查看以下网址:http://www.linuxproblem.org/art_9.html

diff <(ssh admin@10.0.0.10 ls -R /home/admin) <(ls -R /home/admin)

答案 1 :(得分:23)

尝试将“rsync”与“-n”选项一起使用,这只是“干运行”并告诉你它会做什么。

答案 2 :(得分:10)

您可以通过sshfs安装远程目录,然后您可以使用diff -r来比较这两个目录。

或者,您可以在两台计算机上运行类似的find命令来打印文件树(例如文件名,大小和日期),然后使用diff比较两者的输出。当然,这不会比较文件内容:

diff <(ssh host find /home/admin -printf '"%8s %P\n"') \
     <(find /home/admin -printf '%8s %P\n')

请注意ssh调用中printf格式字符串的双引号。 ssh中继删除了一层。

答案 3 :(得分:0)

如果您需要GUI,我发现krusader对此类任务非常有用。 有关详细信息,请参阅https://www.linux.com/news/synchronize-directories-komparator-and-kdiff3 http://krusador.org

example folder compare

答案 4 :(得分:-1)

对于下面的所有示例,空文件夹都无关紧要。

如果 ssh 不需要密码并且您想查看文件

diff -y -W250 \
  <(ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort -k2")
  <(ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort -k2")

如果 ssh 不需要密码,而您只想知道文件夹是否相同

diff -y -W250 \
  <(ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
  <(ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")

如果 ssh 需要密码

  • 安装 sshpass
  • 在 PASS 变量中安全地接收您的密码(密码将在 60 秒内清除):echo -n "Password: "; IFS= read -rs PASS < /dev/tty; trap 'unset PASS; echo "PASS has been cleared"; trap - USR1' USR1; { sleep 60; kill -USR1 $$; } &

所以...

diff -y -W250 \
  <(sshpass -p "$PASS" ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
  <(sshpass -p "$PASS" ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")

如果远程主机上需要 sudo

diff -y -W250 \
  <(ssh user@host1 "echo \"$PASS\" | sudo -S find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
  <(ssh user@host1 "echo \"$PASS\" | sudo -S find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")

并且您可以合并选项。

我推荐 icdiff 而不是 diff,但 diff 就足够了。