为什么 cp 不设置源属性并因 -p 而失败?

为什么 cp 不设置源属性并因 -p 而失败?

我有这些文件:

-rw-rw-r-- 1 root   adm    0 Jun 22 11:25 a
-rw-rw-r-- 1 wilmes wilmes 0 Jun 22 11:23 b

当我以用户 wilmes 的身份 cp b 到 a 时,为什么它保留 a 的原始所有者(root)?

我使用这个命令(无别名): cp ba

为什么当我在命令 cp -pba 中使用 -p 时会失败?

cp: preserving times for 'a': Operation not permitted

我在带有 ext4 的 Ubuntu 17.04 上注意到了这一点。用户 wilmes 是 adm 组的成员,其包含的目录如下所示:

drwxrwxr-x 2 wilmes wilmes 4,0K Jun 22 12:09 ../user/

最重要的是:这个记录在哪里?

答案1

它会失败,因为您需要成为目标 (a) 文件所有者,cp 不会覆盖基本的 UNIX 安全性。用户可以保留自己的文件 wilmes -> wilmes,但不能为其他用户这样做,当然也不能为 root 用户这样做。我假设您没有以 root 身份登录,也没有以 wilmes 身份登录。

在这种情况下,一个文件归 root 所有,另一个文件归 wilmes 所有。要保留,您应该尝试运行:

sudo cp -p b a

相关链接:

例子:

为 root 创建一个文件 a,为标准用户 (joe) 创建一个文件 b。

joe@testbed:~/tmp2$ sudo touch a
joe@testbed:~/tmp2$ touch b

验证权限是否正确。

joe@testbed:~/tmp2$ ls -l
total 0
-rw-r--r-- 1 root    root    0 Jun 22 13:51 a
-rw-r--r-- 1 joe     joe     0 Jun 22 13:51 b

尝试将用户拥有的文件 b 复制到 root 拥有的文件上(这会违反权限):

joe@testbed:~/tmp2$ cp -p b a
cp: cannot create regular file 'a': Permission denied

以 root 身份重复复制,保留权限:

joe@testbed:~/tmp2$ sudo cp -p b a
joe@testbed:~/tmp2$ ls -l
total 0
-rw-r--r-- 1 joe joe 0 Jun 22 13:51 a
-rw-r--r-- 1 joe joe 0 Jun 22 13:51 b

注意:权限被拒绝,不不允许操作。我想您会看到不允许,因为用户 wilmes 确实可以通过组访问该文件,但是,他们不是所有者,所以他们不能完全覆盖它。

从逻辑上讲,您正在替换属于另一个用户(root)的文件,并要求系统也让您成为该文件的所有者,这将是一个灾难性的安全缺陷。

例如,如果我作为普通用户来了很长一段时间,malicious.username01并且想要将 crontab 替换为属于 root 的 ntp 之类的东西,该怎么办?如果您尝试做的事情有效,我可以简单地编写我自己的恶意版本,然后简单地cp -p my-malicious-script /etc/cron.daily/ntp.这太糟糕了。真的真的太可怕了。

答案2

当我以用户 wilmes 的身份 cp b 到 a 时,为什么它保留 a 的原始所有者(root)?

因为cp默认情况下(没有-a-p标志)不会修改目标文件的时间或所有者。在您的情况下,该文件a由 拥有root,但由于您通过该组具有写访问权限,因此您可以修改该文件,包括截断它并完全重写它。您不能做的是修改时间戳,因为只有文件的所有者才能执行此操作。

如果目标文件不存在,则会使用运行用户的 uid 创建该文件cp,即wilmes. (如果没有超级用户权限,您也无法更改所有者。)

但是,由于您也对该目录具有写访问权限,因此您可以先删除目标文件,然后重新创建它,在这种情况下,该文件将由运行cp.

相关内容