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

Akh*_*ula 2 scp download synchronization files

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

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

Aus*_*arn 6

仅就 SCP 而言,实际上没有任何解决方案。该协议只允许完整的文件复制,而不是部分传输。

如果您愿意将目光投向 SCP 之外,则有以下几种选择:

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

    ssh user@host tail -n +`wc -l /local/file.log` /remote/file.log >> /local/file.log
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

  4. 找出一种为生成日志文件的应用程序设置远程日志记录的方法,并将您的本地系统设置为日志主机。当然,这仅在您的本地系统一直运行的情况下才有效,但它也可以保证您拥有最新版本的日志,而无需手动执行任何操作来更新它。