我需要从某个 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
.
还有其他几种(更安全)的选择适合您。这是两个:
使用sshfs将 sftp 目录挂载到系统上的某个位置。然后您可以使用标准 UNIX 命令,如、 、
cp
等mv
来移动文件。这是迄今为止您最好的选择。rm
rsync
使用具有 sftp 库的语言(例如 perl 或 python,以及最常见和当前的编译语言)编写程序来连接到远程服务器,并且:
- 获取要传输的文件列表
- 对于每个文件:
- 下载它
- 以某种方式验证它(例如@thrig建议使用md5sum文件或类似文件)
- 如果没问题,从远程服务器上删除它