如何在没有 root 权限的情况下修复虚拟机上的 sudoers 文件并重启

如何在没有 root 权限的情况下修复虚拟机上的 sudoers 文件并重启

我在一台负载很重的服务器上因语法错误而损坏了我的 sudoers 文件。不幸的是,我丢失了 root 密码。该服务器至关重要,我想避免重新启动。所以,没有 sudo,没有 root,没有重新启动,没有 kdesudo 或 gksu。该服务器是在 kvm 上运行的虚拟机。

您将如何修复此问题?

答案1

这不是一个通用的解决方案,但我发布此信息是为了给处于同样境况的人提供一些启发。

我无法访问迄今为止提到的解决方案,但很幸运能够访问以 运行的 cron 任务root。我使用该 cron 任务运行另一个修复脚本/etc/sudoers,从现在开始我将仅使用visudo

因此,如果您处于这种情况,cron 任务可能会有所帮助。无需停机/服务器重启,也不存在数据混乱的风险dd

答案2

只是一个未经证实的想法:

在主机系统上,您可以访问客户分区的映像,对吗?由于该映像正在使用中,因此您无法轻松挂载它。您不需要挂载分区来编辑单个文件。

  1. 在分区中查找 sudoers 文件扇区 - 使用文本搜索您知道存在于 sudoers 文件中且不经常出现在其他文件中的某些短语,例如# This file MUST be edited with the 'visudo' command as root.您可能使用某些 GUI 十六进制编辑器,或者我相信 grep 也可以在这里完成这项工作。

    或者您可以从客户操作系统中发现 sudoers 文件所在的扇区......

  2. 使用十六进制编辑器直接在磁盘上编辑文件,或者使用dd-将扇区复制到文本文件,编辑它并将其复制回原始扇区。

困难:1. 文件可能缓存在客户操作系统中,也许你会找到一种方法来刷新缓存。2. 使用文本搜索,你可能会发现几个看起来像你的 sudoers 的文件,就像它的已删除版本,要么你找出哪个是正确的一个或者全部修复。

答案3

我经历过类似的sudoers我的 Synology NAS 设备出现问题。

我的解决方案是将以下命令放入“任务计划程序”

chmod 0755 /etc/sudoers

我将其设置为

尽管我的问题与权限有关,但我相信正确配置的一系列命令行输出重定向将清除文件并用基本 shell 替换内容,从而使您重新启动并运行。

就像是:

echo "Defaults syslog=authpriv" > /etc/sudoers

echo "%administrators ALL=(ALL) ALL" >> /etc/sudoers

echo "Cmnd_Alias SHELL = /bin/ash, /bin/sh, /bin/bash" >> /etc/sudoers

echo "Cmnd_Alias SU = /usr/bin/su" >> /etc/sudoers

echo "%wheel ALL=(ALL) NOPASSWD: ALL, !SHELL, !SU" >> /etc/sudoers

答案4

幸运的是我们的服务器是虚拟服务器,我可以访问主机系统。我通过编辑原始磁盘数据解决了这个问题。您也可以尝试这种方法,但要非常小心。这种方法很危险。您可能会损坏其他文件、分区甚至整个硬盘。所以请谨慎行事,并确保你有最近的备份。

  1. 在主机系统上安装 hexedit。
  2. sync在来宾上运行。
  3. 使用 hexedit 打开客户高清设备。
  4. 找到损坏的字符串并记下它的位置(类似于屏幕底部的 0x29221D2B8)。
  5. 使用一些计算或实用程序将数字转换为十进制(我使用了 kcalc)。
  6. 尝试读取损坏的文本dd并确保数字正确。skip=position/ibs。

    sudo dd if=/dev/vg0/vm-100-disk-1 count=1 bs=10 ibs=10 skip=1104162476

  7. 以某种方式覆盖损坏的文本以修复错误。就我而言,我只是用“#”替换了第一个符号以注释掉损坏的内容。使用/obs/seek 参数代替 if/ibs/skip 参数,并使用相同的数字。小心使用换行符和 eof。

    回显“#ncludedir”|sudo dd of=/dev/vg0/vm-100-disk-1 count=1 bs=10 obs=10 seek=1104162476

  8. 您可以用 dd 再次阅读并检查是否完成了您需要的操作。

  9. 返回虚拟机终端并尝试使用 sudo。也许您需要以某种方式清空磁盘读取缓存。祝你好运!:)

相关内容