Linux: 在没有副本的情况下更改文件所有权?
Linux: changing file ownership without a copy?
我有一个 REST 服务器,其目的是组织不同用户生成的文件。为了简单起见,服务器和用户都可以访问共享的网络文件系统。
工作流程如下:用户在临时文件夹中生成文件。然后他通知服务器,服务器将文件放在它自己的位置并将一些元数据存储在数据库中。然后服务器应拥有这些文件并根据需要负责删除它们。
我的问题如下:由于文件可能非常大,我想避免昂贵的复制,而只是将文件从临时文件夹移动到它们的最终目的地。但是,移动文件会阻止服务器更改其所有权 (see here for example)。
有没有办法解决这个问题,无需 1) 复制文件,以及 2)运行 服务器作为 root?
编辑:几个精度:
- 要移动的文件可以是具有文件层次结构的目录
- 最好让服务器拥有最终位置的文件以限制其他用户的访问。
您应该为所有用户和服务器使用一个用户组。使该组拥有临时目录并将其设置为组可写和 sgid。
chown :groupname /path/to/temp
chmod g+s /path/to/temp
chmod 770 /path/to/temp
然后服务器可以很容易地采用文件的所有权。当然这意味着用户可以写入其他用户的文件,但我想这不是问题,因为他们在那里停留的时间很短?
如果您创建一个单独的用户来处理 chown,您可以为该用户提供 CAP_CHOWN 能力,并且您可以让该用户拥有一个设置了 setuid 位的可执行文件(所以它以该用户身份执行)。
为了安全起见,这个可执行文件应该做的事情越少越好,检查越多越好。
它应该在服务器用户移动后为服务器用户执行chown。它应该存在于其他用户不可写的目录中;它可以进行检查以确保它对被要求更改的文件的所有属性(当前所有者、位置等)感到满意,它可以对服务器用户进行硬编码(这样其他人就无法使用它),等等
这可能必须是一个小型 C 程序,因为大多数系统不允许您将 setuid 与脚本一起使用。您可以在网上找到几个执行 chown 的小示例程序——一个是 here
我有一个 REST 服务器,其目的是组织不同用户生成的文件。为了简单起见,服务器和用户都可以访问共享的网络文件系统。
工作流程如下:用户在临时文件夹中生成文件。然后他通知服务器,服务器将文件放在它自己的位置并将一些元数据存储在数据库中。然后服务器应拥有这些文件并根据需要负责删除它们。
我的问题如下:由于文件可能非常大,我想避免昂贵的复制,而只是将文件从临时文件夹移动到它们的最终目的地。但是,移动文件会阻止服务器更改其所有权 (see here for example)。
有没有办法解决这个问题,无需 1) 复制文件,以及 2)运行 服务器作为 root?
编辑:几个精度:
- 要移动的文件可以是具有文件层次结构的目录
- 最好让服务器拥有最终位置的文件以限制其他用户的访问。
您应该为所有用户和服务器使用一个用户组。使该组拥有临时目录并将其设置为组可写和 sgid。
chown :groupname /path/to/temp
chmod g+s /path/to/temp
chmod 770 /path/to/temp
然后服务器可以很容易地采用文件的所有权。当然这意味着用户可以写入其他用户的文件,但我想这不是问题,因为他们在那里停留的时间很短?
如果您创建一个单独的用户来处理 chown,您可以为该用户提供 CAP_CHOWN 能力,并且您可以让该用户拥有一个设置了 setuid 位的可执行文件(所以它以该用户身份执行)。
为了安全起见,这个可执行文件应该做的事情越少越好,检查越多越好。
它应该在服务器用户移动后为服务器用户执行chown。它应该存在于其他用户不可写的目录中;它可以进行检查以确保它对被要求更改的文件的所有属性(当前所有者、位置等)感到满意,它可以对服务器用户进行硬编码(这样其他人就无法使用它),等等
这可能必须是一个小型 C 程序,因为大多数系统不允许您将 setuid 与脚本一起使用。您可以在网上找到几个执行 chown 的小示例程序——一个是 here