SFTP:检查是否正确下载

SFTP:检查是否正确下载

我需要从某个 SFTP 连接下载一些数据,然后删除该 FTP 上的数据。但我必须确保正确下载数据。

目前我只是在 cron 运行的脚本中执行此操作:

sftp -oIdentityFile=key user@server <<EOF
    mget -r *
    mdelete *
    bye
EOF

但我担心,如果由于任何原因下载中断,文件无论如何都会被删除,因为 FTP 连接只会执行下一个命令,而不会在操作失败后中断连接。

我需要确保文件已正确下载,最好是进行哈希比较。但由于我非常怀疑 FTP 是否提供了该功能,那么解决该问题的最佳解决方案是什么?

如果不可能:将所有文件保留在 FTP 服务器上并仅下载新文件可能是一种解决方法。这似乎是一种更简单的解决方案。对于这个解决方案有什么建议吗?

编辑:由于我对服务器没有任何影响,因此我正在寻找最实用的解决方案,以确保在删除所有文件之前下载它们。我不太担心数据本身的完整性(我确实信任 ssh)。

答案1

像您这样的简单sftp脚本对于快速而肮脏的获取脚本来说是很好的,但是当您使用它们来删除文件(尤其是通配符删除)时,就会发生一场灾难。

您的脚本的一个非常明显的危险是,它mdelete *不仅会删除您运行时目录中的文件mget -r *,还会删除您启动后上传到源目录的所有mget文件 - 甚至不包含在mget.

还有其他几种(更安全)的选择适合您。这是两个:

  1. 使用sshfs将 sftp 目录挂载到系统上的某个位置。然后您可以使用标准 UNIX 命令,如、 、cpmv来移动文件。这是迄今为止您最好的选择。rmrsync

  2. 使用具有 sftp 库的语言(例如 perl 或 python,以及最常见和当前的编译语言)编写程序来连接到远程服务器,并且:

    • 获取要传输的文件列表
    • 对于每个文件:
      • 下载它
      • 以某种方式验证它(例如@thrig建议使用md5sum文件或类似文件)
      • 如果没问题,从远程服务器上删除它

相关内容