我有这些文件:
-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
.