不允许 chown,但我有写权限。我怎样才能获得递归所有权?

不允许 chown,但我有写权限。我怎样才能获得递归所有权?

考虑以下场景:

  1. 我可以rwx作为目录的组 ID 的成员访问该目录。
  2. 系统管理员不允许用户运行chown(请参阅这个线程详情)

如何获得目录的递归所有权?

我相信我可以做以下事情,假设我想拥有A

cp -R A B
rm -R A
mv B A

A但这很乏味,并且如果很大的话可能需要大量空间。

答案1

您可以像这样获取所有权:

$ mv A A.old
$ mkdir A
$ mv A.old/* A.old/.[!.]* A.old/..?* A/
$ rmdir A.old

答案2

您实际上只需要获得目录的所有权。普通文件将在您下次修改它们时自行处理,符号链接和管道并不重要,并且我将假设没有设备或其他外来类型。

您可以制作目录的递归副本,但从常规文件创建硬链接而不是复制它们。使用 GNU coreutils(Linux、Cygwin):

cp -al A B

每个常规文件A/dir/file都硬链接为B/dir/file.然后您可以删除源树。

如果您没有 GNU coreutils,您可以使用 rsync 代替:

cd A
rsync -a --link-dest=$PWD . ../B

为了确保删除 A 实际上不会删除任何文件,请检查所有常规文件的硬链接计数是否至少为 2 — 以下命令不应输出任何内容:

find A -type f -links 1

答案3

任何不涉及复制的方法都会遇到 no-chown 规则。请 root 为你做这件事。

如果您雄心勃勃,您可以编写一个新的类似 chown 的实用程序,专为 setuid-root 安装而设计,它会进行自己的安全检查,并根据更宽松的规则决定是否允许 chown。

如果主要是关于磁盘空间,您只需要一个将 cp 与 rm 交错的工具...

相关内容