我想防止目录被删除,假设该目录有这个路径
~/foo
有没有办法让它只能由root用户删除,不使用 sudo 且不成为 root 用户?
例如,这应该有效:
sudo chown -R root:root ~/foo
但如果我不使用 sudo,上面的命令将会失败
chown -R root:root ~/foo
# 失败
chown:更改“/home/olegzandr/foo/bar”的所有权:不允许操作
是否可以在不使用 sudo 的情况下使文件除 root 用户之外不可删除?
(我还阅读了有关该chattr
命令的信息,但标签不可用,因此我无法chattr
向问题添加标签。)
如果我尝试这个:
它似乎不起作用,因为没有抛出权限错误。
答案1
对于你的第一个问题,请使用这样的粘性位:
chmod o+t ~/foo
它将使其无法被除所有者和 root 之外的任何用户删除
对于该chown
命令,如果没有超级用户权限,则无法更改所有者
答案2
目录的所有者通常可以删除和重命名该目录中的文件和子目录。 Linux 安全模块和文件属性(如果启用且可用)可能会增加额外的限制。
编辑以反映问题的变化:
普通用户可以轻松创建一个目录,排除除以下用户之外的所有用户他们自己和根。例如:
mkdir -m 0700 ~/foo
创建一个只有所有者用户 ( drwx------
) 和 root 可以访问的目录;然而
mkdir -m 0770 ~/foo
创建一个只有所有者用户和组成员 ( drwxrwx---
) 以及 root 可以访问的目录。
除了可能使用的任何 Linux 安全模块(例如 SELinux)设置的例外之外,root 可以访问系统上的所有文件。毕竟,这就是为什么他们是超级用户。
如果你运行命令id -un
,你可以看到你当前的真实用户名。该命令id -gn
报告您的真实组以及id -Gn
您所属的补充组的名称。如果您是目录的所有者用户,则可以使用命令将任何文件或子目录的组更改为您所属的任何组chgrp
。
因此,假设您是用户grand
并且属于组marina
和torino
。如果您想创建目录games-marina
,并且games-torino
只有您和属于这两个组的任何用户可以访问(但其他人只能读取,不能修改或删除任何内容),那么请执行以下操作
mkdir games-marina
chgrp marina games-marina
chmod u=rwx,g=rx,o= games-marina
mkdir games-torino
chgrp torino games-torino
chmod u=rwx,g=rx,o= games-torino
在许多系统中,还会为用户创建一个与其用户名匹配的组。这在很多方面都很有用;例如,它通常是您拥有的任何文件的默认组,因此明确只有您可以控制它们的内容。
用户不能正常放弃供他人控制的文件或目录。这种所有权更改确实需要超级用户权限。 (例如,要使用 更改文件或目录的所有者chown
,您需要是 root 用户,或者在 Linux 中具有 CAP_CHOWN 功能。)
有很多原因可以解释为什么让这种遗弃发生是一个坏主意。技术上是可以实现的,但我个人没见过任何还不错的用例。我很确定OP正在尝试做一些事情......我们可以说,在这里没有用。
sudo
(我确实编写了一些脚本,允许属于特定组的成员(是的,Web 管理员)之间的某些目录树中的文件所有权,但是使用几个 bash/dash 帮助程序脚本很容易安全地进行设置。)
如果我们想要创建目录/home/olegzandr/foo
所有者不可删除的目录/home/olegzandr
,我们需要创建foo
一个挂载点,并在其顶部绑定挂载一个(root 拥有的)目录。例如,我们可以创建目录(显然由 root 用户拥有),并使用例如/root/foo
绑定挂载它/home/olegzandr/foo
sudo mount --bind /root/foo /home/olegzandr/foo
对于绑定挂载,该/home/olegzandr/foo
目录必须仍然存在(因为它用作挂载点),并且目录的所有者/home/olegzandr
可以操作该目录,但在绑定挂载存在时他们无法删除该目录。由于/home/olegzandr/foo
是 root 拥有的新挂载点,因此 的所有者/home/olegzandr
无法操作它。
/home/olegzandr
为了防止在绑定挂载未生效时挂载点被所有者删除,应将挂载点设置/home/olegzandr/foo
为不可变。要创建初始安装点(尚未安装绑定安装),我将使用
sudo mkdir /home/olegzandr/foo
sudo chmod 0700 /home/olegzandr/foo
sudo chattr +i /home/olegzandr/foo
请注意,这也意味着没有人可以意外复制数据或在 中创建子目录/home/olegzandr/foo
,除非绑定安装有效。 (当绑定挂载生效时,所有者、组和权限也/root/foo
适用/home/olegzandr/foo
。)
在 ext4 和大多数其他文件系统上,我们通常可以使用中间不可变目录来创建/home/olegzandr/foo/bar
不可/home/olegzandr/foo
变的目录。这样所有者/home/olegzandr
就不能修改或删除/home/olegzandr/foo
,也不能删除/home/olegzandr/foo/bar
。后者还是 root 拥有的目录中的子目录,因此不再受/home/olegzandr
.对此进行实验:
sudo mkdir /home/olegzandr/foo
sudo mkdir /home/olegzandr/foo/bar
sudo chmod 0555 /home/olegzandr/foo
sudo chattr +i /home/olegzandr/foo
/home/olegzandr/foo/bar
然后您可以根据需要设置所有者、组和模式。只要/home/olegzandr/foo
它是不可变的,就不能被删除(即使是 root)。
要更改不可变文件属性,需要是 root 或具有此CAP_LINUX_IMMUTABLE
功能(通常只有 root 具有)。