perl - SFTP文件同时上传和下载

标签 perl sftp

cronjob 每 3 小时运行一次,以使用 SFTP 下载文件。预定的程序是用 Perl 编写的,使用的模块是 Net::SFTP::Foreign

Net::SFTP::Foreign 能否下载使用 SFTP 仅部分上传的文件?

如果是这样,我们是否需要检查 SFTP 文件的修改日期以检查复制过程是否完成?

假设某人正在通过 SFTP 上传一个新文件,并且他正在进行文件上传/复制。如果同时尝试下载,我是否需要针对仅获取部分文件的可能性进行编码?

最佳答案

这不是您使用的 SFTP 客户端 的问题,这无关紧要。这就是 SFTP 服务器处理这种情况的方式。

某些 SFTP 服务器可能会锁定正在上传的文件,阻止您在文件仍在上传时访问它。但是大多数 SFTP 服务器,尤其是常见的 OpenSSH SFTP 服务器,不会锁定文件。

这个问题没有通用的解决方案。检查时间戳或大小更改可能对您有用,但它几乎不可靠。

该问题有一些常见的解决方法:

  • 上传完成后让上传者上传“完成”文件。让您的程序等待“完成”文件出现。

  • 您可以拥有专门的“上传”文件夹,并让上传者(自动)将上传的文件移动到“完成”文件夹。让您的程序只查看“完成”文件夹。

  • 为正在上传的文件制定文件命名约定 (".filepart"),并让上传者在上传后(自动)将文件重命名为其最终名称。让您的程序忽略“.filepart”文件。

    参见(我的)文章 Locking files while uploading / Upload to temporary file name例如实现这种方法。

    此外,一些 FTP 服务器内置了此功能。例如 ProFTPD 及其 HiddenStores directive .

  • 一个粗暴的 hack 是定期检查文件属性(大小和时间),如果属性在一段时间内没有改变,则认为上传已完成。

  • 您还可以利用某些文件格式具有明确的文件结束标记(如 XML 或 ZIP)这一事实。所以你知道,当你下载一个不完整的文件时。

详情见我对SFTP file lock mechanism的回答.

关于perl - SFTP文件同时上传和下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43848774/

相关文章:

php - 如何使用 phpseclib 设置自定义 SFTP 端口

git - 如何在 git-ftp 客户端上使用 sftp?

c++ - Perl XS 未使用的变量 'Perl___notused' 警告

windows - 运行Perl脚本通过DOS命令提示符调用网页?

perl - mojolicious lite 中的 hypnotoad 辅助函数

linux - 如何使用 perl 脚本和 ssh 在远程 linux 服务器中运行 bash 或 shell 脚本

bash - 找不到文件时sftp避免退出

json - 访问解码为 HASH 和哈希引用数组的 JSON

java - java程序中的安全sftp密码

python - 如何在Python中通过SFTP检查Windows NTFS文件的S_ISREG?