使用 sudo 或 root 删除文件夹的区别

使用 sudo 或 root 删除文件夹的区别

今天我注意到使用 sudo 或以 root 身份执行命令之间存在有趣的区别。

使用 sudorm -rf /opt/nextcloud/*不会删除文件夹

vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud  nextcloud-16.0.4

当我第一次成为 root 然后执行命令时,文件夹被删除

vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~# 

为什么会这样?使用 sudo 删除文件夹的正确方法是什么?

答案1

该命令sudo rm -rf /opt/nextcloud/*由以普通用户身份运行的 shell 解释。shell在运行*之前会尝试扩展。如果由于某种原因无法扩展,则命令变为:sudo*

  • 要么sudo rm -rf /opt/nextcloud/*where sudo(然后rm)/opt/nextcloud/*与文字一致*,并且不会发生进一步的扩展;这是 POSIX 行为;/opt/nextcloud/*显然不存在。
  • 或者sudo rm -rf在某些情况下(例如在 Bash 中nullglob设置了该选项时)。

还有其他可能性(例如failglob在 Bash 中比较)但它们似乎与您的情况不符。

无论如何,-f选项rm都很重要。这意味着

-f
不提示确认。在没有文件操作数或操作数不存在的情况下,不要写入诊断消息或修改退出状态。[…]

来源

实际上,您提供了一个“不存在的操作数”或“没有文件操作数”,因此该命令没有执行任何操作并且默默地成功了。


我的假设是,非提升权限的 shell 无法扩展,/opt/nextcloud/*因为普通用户对 没有读取权限/opt/nextcloud/。另一种可能性是你在 中输入了错误/opt/nextcloud/*,但没有发现,因为没有错误消息。没有错误消息是因为这就是rm -f工作原理。

sudo ls /opt/nextcloud/不涉及 shell 扩展。该命令ls以 root 身份运行。ls本身可以访问指定目录及其内容,因此它可以工作。

之后,sudo su -您进入以 root 身份运行的 shell。此 shell 能够扩展/opt/nextcloud/*,因此可以rm -rf /opt/nextcloud/*按预期工作。

相关内容