perl 同时上传和下载SFTP文件

biswetbf  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(171)

cronjob每3小时运行一次,以使用SFTP下载文件。计划的程序是用Perl编写的,使用的模块是Net::SFTP::Foreign
Net::SFTP::Foreign是否可以下载使用SFTP仅部分上传的文件?
如果是,我们是否需要检查SFTP文件的修改日期以检查拷贝过程是否完成?
假设有人在SFTP中上传了一个新文件,并且文件上传/复制正在进行中。如果同时尝试下载,我是否需要编写代码来实现只获取文件的一部分的可能性?

uklbhaso

uklbhaso1#

这不是您使用的SFTP * 客户端 * 的问题,这无关紧要,而是SFTP * 服务器 * 如何处理这种情况。
某些SFTP服务器可能会锁定正在上载的文件,从而阻止您在上载过程中访问该文件。但大多数SFTP服务器(尤其是常见的OpenSSH SFTP服务器)不会锁定文件。
对于这个问题没有通用的解决方案。检查时间戳或大小的变化可能对你有用,但它很难可靠。
此问题有一些常见的解决方法:

  • 上传完成后,让上传者上传“done”文件。让你的程序等待“done”文件出现。
  • 你可以有一个专门的“上传”文件夹,让上传者(原子地)把上传的文件移到“完成”文件夹。让你的程序只看“完成”文件夹。
  • 为上传的文件制定一个文件命名约定(.filepart),并让上传者在上传后(自动地)将文件重命名为最终名称。让你的程序忽略.filepart文件。

有关实现此方法的示例,请参见(我的)文章Locking files while uploading / Upload to temporary file name
此外,某些FTP服务器内置了此功能。例如,ProFTPD及其HiddenStores指令。

  • 一个总黑客是定期检查文件属性(大小和时间),并认为上传完成,如果属性没有改变了一段时间间隔。
  • 你也可以利用一些文件格式有明确的文件结束标记(如XML或ZIP)的事实,所以你知道,当你下载一个不完整的文件。

有关详细信息,请参阅我对SFTP file lock mechanism的回答。

k2arahey

k2arahey2#

当上传过程也在你的控制之下时,最简单的方法是使用临时名称上传文件(例如,foo-20170809.tgz.temp),一旦上传完成,就重命名(Net::SFTP::Foreign::put方法支持atomic选项,该选项可以完成此操作)。然后在下载端,过滤掉名称与临时文件对应的文件。
无论如何,可以指示Net::SFTP::Foreigngetrget方法恢复传递选项resume => 1的传输。
此外,如果您对SFTP服务器具有完全SSH访问权限,则可以使用fuser或某些类似工具检查是否有其他进程仍在写入要下载的文件(但请注意,即使这样,如果存在某些网络问题,并且上传程序需要重新连接才能恢复传输,则文件也可能不完整)。

ffx8fchx

ffx8fchx3#

您可以检查文件的大小。
1.连接到SFTP。
1.检查文件大小。
1.睡眠5/10秒。
1.再次检查文件大小。
1.如果大小未更改,则下载文件,如果大小更改,则执行步骤3。

相关问题