如何让用户在linux上将文件传输给其他用户

我们有一个由几千个用户组成的环境,在大约40个集群上运行应用程序,大小从20个计算节点到98,000个计算节点。 这些系统上的用户生成大量的文件(有时> 1PB),由传统的Unix权限控制(由于文件系统的特殊性,ACL通常不可用或不实用)。

我们目前有一个名为“give”的程序,它是一个suid-root程序,允许用户在组权限不足时将文件“授予”给另一个用户。 所以,用户可以input如下所示的文件给另一个用户:

> give username-to-give-to filename-to-give ... 

然后,接收用户可以使用一个名为“take”(命令程序的一部分)的命令来接收文件:

 > take filename-to-receive 

然后文件的权限被有效地传送给接收用户。

这个程序已经存在好几年了,我们希望从安全和function的angular度来重新审视。

我们目前的行动计划是消除我们当前实施“give”的恶性循环,并将其打包为开源应用程序,然后再重新部署到生产环境中。

当只有传统的Unix权限可用时,有没有人有另一种方法用来在用户之间传输超大文件?

如果发射器真的愿意放弃文件,则可以使用SUID二进制文件将文件移动到所有可写的目录,并具有粘滞位(如/tmp ),然后将所有权更改为新的所有者。 chown(3)已经负责为你删除set-user-IDset-group-ID位。 通过这种方式,新的所有者可以对文件做他想做的事情,包括移动它。

如果你想使用多个文件系统作为主目录,并且希望确保你不会跨越文件系统边界,那么所有可写的目录都可以属于用户的主目录,因为性能会立即变得糟糕透顶。 在这种情况下,您可能需要确保收件人知道何时提供新文件。

电子邮件可以做到这一点。 更unixy的解决scheme将是一个/etc/profile列出你新交付的文件。 如果您使用pam_echo提供此function( 例如,使用file=/tmp/deliveries/%u pam_echo(8) file=/tmp/deliveries/%u ,请参阅pam_echo(8) ),可以增加额外的奖励。 与任何与PAM相关的东西,你都要先检查一下你的所有实现是否提供了这样一个模块。

您可以使用带有共享目录的系统(可能没有执行perms。),其中给定用户的东西用特定的文件名结构(例如to-$username_from-$username.tar )进行存档。 给予该文件并将其传送给目标用户; 提取文件并将其删除。

如果你想做一个真正的移动(IE,更改文件的位置和权限,因为巨大的文件大小不复制),你可能能够摆脱与-x perms共享目录(所以没有人可以列表文件)和相同的chown方法。 mvchown / mv

正如xryl669所说,你可以使用一个目录来实际共享文件。 它应该是这样的:

 $ ls -ld shared drwxrws--- 2 root usergroup 4096 somedate shared $ ls -l shared drwx-wx--- 2 user1 usergroup 4096 somedate user1 drwx-wx--- 2 user2 usergroup 4096 somedate user2 drwx-wx--- 2 user3 usergroup 4096 somedate user3 drwx-wx--- 2 user4 usergroup 4096 somedate user4 

给命令变成了

 #!/bin/sh #Use a random suffix to prevent guessing RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1) NEWNAME=/path/to/shared/$2/$1$RANDOM #Move the file mv $1 $NEWNAME #Make it readable chmod 440 $NEWNAME 

take命令看起来像这样:

 $ cd /path/to/shared/user $ ls ... $ mv somefile ~ 

我build议重写应用程序确实模仿一个“给”和“采取”,而是“推”和“拉”它从一个受保护的目录。 您的目录只能用于推/拉应用程序 – 处理文件移动。 或者,您的应用程序/脚本可以创build一个随机的临时目录,并且只为发送者和接收者设置权限。

希望有更多的安全性? 您可以使用PGP对文件进行encryption/签名(使用接收者的公钥)。

关于从“安全和function的angular度”重做它,我强烈build议不要创buildSUID程序。 如果不以正确方式删除权限,则可以虚拟访问系统上的任何文件。 如果你的程序有问题(缓冲区溢出等) – 你可以利用这个来获得你系统的root权限。

这对你来说可能是没有用的,但是对于引用cp –reflink source target使用copy-on-write来完成文件的精简拷贝。

这意味着您可以直接复制文件,只有更改的块才会被复制。 与硬链接不同,新文件具有自己的inode和元数据,这意味着您可以使用标准chown内容将文件的副本提供给新用户。

据我所知,这是一个function,目前仅在OCFS2和btrfs上可用。 我想这确实解决了你的问题,但看到它的可用性并不普遍,它可能不会有用。

我明白“拿”的必要性,因为“如果我不使用这个命令,我可以拒绝接收这个文件”。 不过这也意味着你需要一个旁道来发送文件名。

如果你想要一stream的系统,你可能会对Ajaxplorer(www.ajaxplorer.info)感兴趣,它是一个基于Web的文件浏览器(带有许多凭证插件,比如LDAP),在那里你有一个“创build公共/私人URL链接“function。 用户将login到显示其主文件夹的Web服务器,select一个文件,右键单击“创build私有URL链接”并设置电子邮件以发送链接。 其他用户则必须点击电子邮件中的链接才能下载文件。

在一个内联网上,它会像你的networking服务器一样快,而且在公共互联网上也能正常工作(但速度较慢)。

这也意味着你的用户不需要有Unix命令行知识。

(免责声明:我已经帮助在AjaXplorer中开发这个function)