如何将文件从一个用户传递给另一个用户(而不创建任何副本)?

如何将文件从一个用户传递给另一个用户(而不创建任何副本)?

假设用户“qqq”有文件 /home/qqq/bigfile.dat,并想在无需 root 帮助的情况下将其传递给用户“aaa”(它需要归“aaa”所有)。用户“qqq”和“aaa”应该怎么做?

天真的方式:

  1. uid=qqq$ mv bigfile.dat /home/aaa/
  2. uid=aaa$ chown aaa /home/aaa/bigfile.dat # Operation not permitted

当然也可以通过使用 ACL(uid=qqq$ setfacl u:aaa:rw- /home/aaa/bigfile.dat)或创建临时副本(uid=aaa$ mv bigfile.dat bigfile.dat_ && cat bigfile.dat_ > bigfile.dat && rm bigfile.dat_)来实现,但是这两种方式似乎都有缺点。

两个用户都同意(可以发出一些命令)“传递”文件。它应该很快,保留 inode 和其他属性等。

怎样才能干干净净呢?

答案1

旧的 unix 系统允许任何用户将自己的文件 chown 到任何目标。大多数系统不再这样做,因为这会造成一些安全问题:

  • 如果有磁盘使用配额,用户 A 可以将文件存储在私人目录中,由用户 B 承担费用。用户 B 永远不会知道,除非将可见的磁盘使用量与配额进行比较,并且无法找到配额窃贼。

  • 一些特权程序(set[ug]id 可执行文件或守护程序)假设如果某个文件归某个用户所有,则该用户已批准其内容。如果用户 A 可以将文件 chown 给用户 B,则 A 可以诱骗特权程序接受任何数据。(无论如何,这是一种不安全的设计,因为即使 A 确实编写了该文件,A 也可能没有批准将其用于此特定目的;但此类程序确实存在,禁止 chown 确实可以降低风险。)

  • 非 root 用户执行的 chown 操作无法撤消。请注意,这是您可能要承担的风险(事实上,在 unix 文件系统上,您还可以执行其他操作,但只有其他用户配合才能撤消)。

据我所知,在大多数现代 unix 系统中,没有 root 的配合,是不可能更改文件的所有权的。root 可以执行 chown 或通过 sudo 授予 A 或 B 执行此操作的权限,但这需要比通常需要的更有针对性的 root 干预。

如果启用了 ACL,正如您所注意到的,这会产生 chowning 的大部分实际效果。

如果工作流程确实要求 A 在某个时间点成为所有者,而 B 在其他时间点成为所有者,那么您可以探索其他选项。

  • B 可能会使用假根运行一个程序并使其相信它以 root 身份运行,这允许模拟 chown 仅存在于 fakeroot 内存中 ( fakeroot sh -c 'chown B file; su B -c program')。

  • 你可以用 FUSE 来玩点花样。例如绑定文件系统可让您创建目录树的视图,其中文件具有不同的所有者 ( mkdir view_for_B; bindfs -u B actual_directory view_for_B)。

答案2

您能否将文件移动到两个用户都有写访问权限的某个共享空间(或者 Linux 上不存在这种东西?),然后让所有者将其 chmod 为接收者?

我的思维根植于 Mac OS X,因此这对您可能有用,也可能没用。

答案3

这取决于您所说的“无需 root 的帮助”是什么意思。如果您可以让 root 将 aaa 和 qqq 添加到某个新组(任何名称都可以),并确保该文件对新组至少具有 r-- 权限...(它可以为用户 aaa 保留 rwx - 因此您获得 => aaa:newgroup rw-r----- )那么无需 root 的进一步帮助,aaa 就可以修改并且 qqq 可以读取同一个文件。

如果您想“违背 root 的意愿”来做这件事,那么如果您找到任何可行的方法,我会认为这是一个错误。我们花了很多心思来阻止这种情况,因为如果 aaa 可以将木马放入 qqq 可以访问的目录中并可能“意外”运行,那么这是一个安全问题。

答案4

其中一种方法是创建一个 ssh-key,允许用户QQ连接为AAA。 作为QQ

ssh-keygen -t rsa

并决定是否要使用无密码密钥。

然后将新创建的密钥添加到AAA通过运行QQ

ssh-copy-id -i ~/.ssh/id_rsa.pub aaa@localhost

之后你可以像这样移动文件:

scp bigfile.dat aaa@localhost:

(或者使用你最喜欢的 sftp 客户端)

这样 sshd 就会负责更改所有权。

使用 scp/sftp 进行本地传输可能听起来很奇怪,但至少它是有效的!:)

相关内容