2014-11-14 46 views
3

如何确保在传输过程中通过SFTP上传的文件(在Linux基本系统中)保持锁定状态,以便自动化系统无法读取它?SFTP文件锁定机制

客户端有没有选项?还是服务器端?

回答

8

从版本5起,SFTP协议支持锁定。请参阅specification

您没有指定,您使用的是什么SFTP服务器。所以我假设是最广泛的OpenSSH。 OpenSSH仅支持SFTP版本3,所以它不支持锁定。

无论如何,即使您的服务器支持文件锁定,大多数SFTP客户端/库也不会支持SFTP版本5.即使他们这样做,他们也不会支持锁定功能。请注意,锁是明确的,客户端必须要求它。

有该问题的一些常见的变通办法:

  • 作为建议由@ user1717259,可以让客户端上传一个“做”的文件一旦上传完成。让您的自动系统等待“完成”文件出现。
  • 你可以有一个专门的“上传”文件夹,并让客户端(自动)将上传的文件移动到“完成”文件夹中。只让您的自动化系统看起来“完成”文件夹。
  • 对上传文件(“.filepart”)有一个文件命名约定,并让客户端(原子地)在上传到其最终名称后重命名该文件。让你的自动化系统忽略“.filepart”文件。
    有关实施此方法的示例,请参阅(我的)文章Locking files while uploading/Upload to temporary file name
  • 严重的黑客攻击是定期检查文件属性(大小和时间),并考虑上传完成,如果属性在某段时间内没有改变。
+1

所以它是一个版本限制:(。不幸的是,在我当前的解决方案中,解决方法不太容易实现,加载目标文件夹中的文件的系统无法在最后重命名它。我看到,我有两个解决方案:将文件放在备用目录中,并构建sh脚本以在目标目录中移动/重命名它们,或尝试将SFTP服务器更新为5+ – CyberDracula 2014-11-19 10:02:57

+0

感谢您的帮助,不需要加载系统无法运行脚本我们决定现在我们将构建一个cron脚本来将文件移动到目标目录 – CyberDracula 2014-11-21 16:22:34

+0

cron脚本如何告诉上传完成? – 2014-11-21 16:44:02

7

解决此问题的典型方法是上传您的真实文件,然后上传空白的'done.txt'文件。

在尝试读取真实文件之前,自动系统应等待“完成”文件的出现。