警告

警告

我使用的是ubuntu 12.04(32位)。今天,我错误执行了一个命令:

警告

不要执行此命令:

sudo find / -type d -exec chmod -Rf a-wr {} \;

无法登录系统;系统只有一个用户,禁用root。谁知道怎么解决?

答案1

取消系统中所有目录的读写权限显然会破坏每个正常的发行版。这是无稽之谈。

编辑1

可以通过启动另一个 Linux(从 CD/DVD/USB 棒)并正确设置所有受影响卷的访问权限来修复系统。恢复原始状态可能很复杂,但让其重新工作则更容易。如果只有一个用户并且没有守护进程为网络提供服务,则不会出现问题或安全风险。

mount -t auto /dev/whatever /mnt/targetvolume
find /mnt/targetvolume -type d -exec chmod 755 {} \;
find /mnt/targetvolume -type f -exec chmod 644 {} \;
chmod -R a+x /mnt/targetvolume/bin /mnt/targetvolume/sbin \
  /mnt/targetvolume/lib /mnt/targetvolume/lib64 /mnt/targetvolume/sbin \
  /mnt/targetvolume/usr/ /mnt/targetvolume/usr/bin \
  /mnt/targetvolume/usr/lib /mnt/targetvolume/usr/lib64 \
  /mnt/targetvolume/usr/sbin

恢复 /etc 中的正确权限非常重要。我的建议是要求具有相同发行版的人(他最好已经安装了您安装的所有软件)来为您提供以下内容:

# on a working system
getfacl --recursive /etc > acl-etc.txt
# on your system
setfacl --restore=acl-etc.txt /etc
# or from the rescue system
setfacl --restore=acl-etc.txt /mnt/targetvolume/etc

这可以通过以下方式进一步改进

  1. 检查 /etc 中的所有文件和目录是否存在于参考系统中
  2. 让包管理器检查已安装包的访问权限(例如 rpm --verify package)

答案2

让我们看看发生了什么,以及可以采取什么措施(如果有的话)。

sudo find / -type d -exec chmod -Rf a-wr {} \;

这可以分解为一些相当简单的部分:

sudo find / -type d

本身无害。这只是生成-type d文件系统上所有目录(这就是它的用途)的列表。

-exec

对于列表中的每个条目,执行给定的命令

chmod -Rf a-wr {}

现在我们开始认真了。{}扩展到当前列表条目,因此对每个目录执行的命令是chmod -Rf a-wr $DIRNAME.对于chmod,-R意味着递归操作,-f抑制错误消息输出,并a-wr删除所有用户的写入和读取权限(a代表all,这与例如o非所有者不同)。

\;

要执行的命令行结束。

因此(因为将 -R 参数传递给 chmod 并为其提供一个目录,会导致它对其下的所有内容执行模式更改)您执行的命令实际上与更容易理解的命令相同

chmod --recursive --quiet a-wr /

我怀疑我真的需要说系统上的几乎所有内容都必须是可读的(并且其中很多是可写的)某人让事情顺利进行。另请注意,删除目录的读取权限将导致无法使用普通方式从中获取目录列表,这可能会在其他地方造成严重破坏。

可能可以通过重新安装已安装的软件包来恢复,但这不会对您的主目录中的任何内容有任何帮助,并且不能保证它会正常工作。您将需要一个适当的架构 live CD(我建议您使用与您正在使用的操作系统相同的 live CD),使用它启动,安装根文件系统并放入 shell。然后chroot /mnt /bin/bash其中/mnt是系统根文件系统的挂载点,后面跟着mount -a挂载其余的文件系统。

一旦到达那里,dpkg -u --reinstall install '.+'应该重新安装所有软件包,修复大部分损坏。请注意,这将需要一段时间才能完成。

接下来,检查您的主目录并设置合理的权限。您可以从以下内容开始,这至少应该让您基本上加快速度。

find /home/me -not -type d -exec chmod 640 {} \;
find /home/me -type d -exec chmod 750 {} \;

这会将所有目录设置为用户读/写/执行,组读/执行,其他人无访问权限,并将非目录设置为用户读/写,组读,其他人无访问权限,这是一个合理的基线。

再次强调,不能保证在此修复后一切都会正常工作(或者修复完全有效;我没有尝试过确切的命令,当然也不是在您创建的条件下),但如果它有效,则这应该至少允许系统启动。一旦有了可启动的系统,执行进一步的修复就会变得更加容易。

更简单的替代方案,如果你有的话,那就是练习你的备份恢复实践。

答案3

约翰试图提醒你,但你忽略了。现在,如果您已经完成了损坏,请以单一模式启动系统并检查日志。尝试将 /tmp 的权限更改为 drwxrwxrwt - 'chmod o+t /tmp' 并检查。

相关内容