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

ffx*_*sam 3 sudo shell permissions globbing

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

Ant*_*gan 7

原因

Shell 解释并扩展任何 glob 字符(通配符),例如星号。命令的这种解释发生在sudo没有目录读取权限的当前外壳程序中(在执行命令之前)。由于当前 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
Run Code Online (Sandbox Code Playgroud)

解决方案

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

sudo bash -c "rm -f /var/log/nginx/ab*"
Run Code Online (Sandbox Code Playgroud)

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