如何通过 SCP 从远程系统传输文件的一部分?

如何通过 SCP 从远程系统传输文件的一部分?

我正在尝试获取重复更新的日志文件。我想要更新的文件,但不想通过 SCP 从远程系统一次又一次下载整个文件。

有什么想法可以以最少的网络使用来实现这一目标吗?

答案1

仅靠SCP,实际上没有任何解决方案。该协议仅允许完整文件副本,不允许部分传输。

如果您愿意不仅仅关注 SCP,还有以下几种选择:

  1. 使用如下命令生成仅包含日志文件新行的文件并传输该文件:

    ssh user@host tail -n +`wc -l /local/file.log` /remote/file.log >> /local/file.log
    

    这将计算本地文件中的行数,并告诉远程系统通过 SSH 连接打印该行号之后的所有行,然后通过 shell 重定向将其附加到本地文件。此方法在某些 shell 中可能有点挑剔,并且有点活泼(在复制文件时到达文件的写入可能最终仅部分传输,但不会在下一次调用时完全传输)。

  2. rsync与选项一起使用--checksum。这使得数据的增量传输成为可能,并且由于它使用的滚动哈希校验和,应该传输绝对最少的数据。与第一种方法不同,这根本不活泼,但它还需要两端都存在 rsync。

  3. 设置支持字节范围请求的(安全)Web 服务器。然后,您可以使用 HTTP HEAD 请求来获取新文件大小(如果文件未更改,则可以选择使用 If-Modified-Since 标头将其转换为无操作),并请求从副本所在位置扩展的范围结束于 HEAD 请求报告的总长度。这涉及的设置最多,并且可以传输部分线路,但可以保证您不会丢失任何数据。

  4. 找出一种为生成日志文件的应用程序设置远程日志记录的方法,并将本地系统设置为日志主机。当然,只有当您的本地系统始终处于开启状态时,这才有效,但它也可以保证您拥有最新版本的日志,而无需您手动执行任何操作来更新它。

相关内容