Unix本地文件与远程隐藏文件之间的区别

4

我正在处理一系列自动化测试,在运行KSH的2个Unix虚拟机上执行。这些虚拟机是独立的,并且它们几乎具有相同的.profile文件。我想通过启动以下命令来研究它们之间的差异:

tkdiff /usr/system/.profile system@{external_IP}:/usr/system/.profile

我在第一台虚拟机上尝试了一下,但没有成功。

enter image description here

我猜直接访问隐藏文件是不可能的。有没有解决方案或替代方法呢?


你的 system@{external_IP}:/usr/system/.profile 并不是一个真正的文件。尝试使用 进程替换 https://tldp.org/LDP/abs/html/process-sub.html,像这样 tkdiff /usr/system/.profile <(ssh system@{external_IP} cat /usr/system/.profile)。虽然如果 tkdiff 需要一个可寻址的文件,那么这种方法可能行不通。 - Mark Setchell
@MarkSetchell 我尝试了你的解决方案,但是我收到了这个奇怪的消息:“错误:您指定了4个文件和0个修订版本”。我会阅读你的网页链接并尝试类似的东西,感谢你的回复 :) - 0009laH
1
我应该注意这是一个“bash-ism”,所以只有在bash中才有可能工作。 - Mark Setchell
哎呀,我使用KSH工作:/ 我更新了我的答案以通知您。 - 0009laH
如果您使用GNU emacs,您可以获得那个。 - Basile Starynkevitch
显示剩余2条评论
3个回答

3
如果您想比较两台远程机器上的不同文件,我建议按照以下步骤进行: 1. 比较校验和: 首先比较校验和。使用summd5sumsha256sum计算文件的哈希值。如果哈希值相同,则有相同文件的概率极高!您甚至可以通过使用wc检查文件中的字符数、行数和单词数来增加这种概率。
$ file="/usr/system/.profile"
$ md5sum "$file" && wc "$file"
$ ssh user@host "md5sum '$file' && wc '$file'"

2. 运行简单的差异比较

使用经典的命令行工具运行简单的差异比较。它们遵循POSIX标准,使用-作为/dev/stdin。这样你就可以执行:

$ ssh user@host "cat -- '$file'" | diff "$file" -

注意:使用旧版本的 tkdiff 或新版本的 svn/git 可能会有些棘手,因为 tkdiff 中存在错误。如果其中一个文件可能在版本控制下,或者你处于一个受版本控制的目录中,它将快速抛出以下形式的错误:svn [XXXX] file .... is not a working copyfile xxxx is not part of a revision control system。坚持使用 diff!

谢谢你的答复,你的解决方案的第一步是一个非常好的想法,并且简单的差异处理很有效 :) 我会查阅一些关于tkdiff的文档。 - 0009laH

1
您正在使用文件名约定"user@host:/path/to/file"作为第二个参数传递给"tkdiff"。
这种命名约定不是Ksh本地支持的,而是像"scp"和其他一些程序可以理解的(可以交互,例如要求输入远程系统的密码或其他身份验证相关问题)。
但从"tkdiff"手册中,它没有提到内置支持该文件命名约定"userid@host:/path/to/file",并且这样的支持也没有内置到"ksh"中。
因此,您可能需要分两步进行操作,首先使用"scp"或类似工具将远程文件复制到本地,然后使用"tkdiff",其中一个参数是本地文件,另一个是刚刚复制的文件;或者安排将其他VM文件系统的一部分挂载到本地,然后使用适当的参数运行"tkdiff"。
显然,这两个文件都需要由您的用户ID或在userid@host:/path/to/file中指定的用户可读才能正常工作。

抱歉回复晚了,我明天上班会尝试您的解决方案。 - 0009laH
感谢您提供的替代方案,我将您的解决方案标记为有效,因为您是第一个提供出色答案的人 :) - 0009laH

0

您可以通过远程ssh比较,使用cat命令行运行远程显示,如下:

tkdiff <(ssh system@{external_IP}1 'cat /usr/system/.profile') <(ssh system@{external_IP}2 'cat /usr/system/.profile')

在您的情况下,为了能够与本地的.profile文件进行比较,需要这样做:
tkdiff /usr/system/.profile <(ssh system@{external_IP} 'cat /usr/system/.profile')

你是否尝试过使用简单的diff命令行(使用-b -B选项来删除空白行和空格比较):

diff -b -B /usr/system/.profile <(ssh system@{external_IP} 'cat /usr/system/.profile')

谢谢您的回复,我明天回去上班时会尝试一下(目前还没有尝试过diff)。 - 0009laH
我已经尝试了这个解决方案,但它返回一个错误('(' unexpected)。当尝试使用diff解决方案时,同样的事件发生。 - 0009laH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接