使用带通配符的 sudo 从根目录删除文件

使用带通配符的 sudo 从根目录删除文件

假设我有一个文件夹,/var/log/nginx该文件夹受保护(由 root 拥有,其他人都无法读取或写入)。即使使用 sudo,我也无法避免sudo rm -f /var/log/nginx/ab*出现“没有这样的文件或目录”。我是否必须实际加载 root shell 才能执行此操作,还是有其他方法?

答案1

原因

shell 会解释并扩展任何 glob 字符(通配符),例如星号。命令的解释发生在当前 shell 中(在sudo执行命令之前),当前 shell 没有目录的读取权限。由于当前 shell 找不到与 glob 模式匹配的文件,因此不会执行路径名扩展,shell 将rm-f/var/log/nginx/ab*(带有文字星号)作为参数传递给sudo命令。

sudo命令反过来启动rm尝试删除路径为/var/log/nginx/ab*(星号是 Unix 文件名的合法字符)的文件的命令。由于这样的文件实际上不存在,因此它会报告失败。对于 GNU 来说rm,这个错误消息是明确的;满的以下错误消息表明被删除的(单个)文件不存在:

rm: cannot remove `/var/log/nginx/ab*': No such file or directory

解决方案

解决方案是以具有执行文件名扩展所需权限的超级用户身份启动新 shell:

sudo bash -c "rm -f /var/log/nginx/ab*"

上述命令启动一个以 root 身份运行的新 shell,选项-c用于传递要由 shell 运行的命令。由于命令被引用,星号不会被当前 shell 解释,而是按原样传递给新的 root shell,允许它在启动命令之前扩展路径名rm

答案2

您的文件名可能有问题,或者文件名中可能有空格。

因此,请尝试以下解决方法:

  1. 尝试使用 prefix--来表示选项的结束,例如:

    sudo rm -vf -- /var/log/nginx/ab*
    
  2. 使用find

    sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. 如果您认为您的文件在 Linux 上受到保护,请先尝试删除保护:

    chattr -i ab*
    

相关内容