我已经打破了我的sudoers文件在一个重载服务器上的语法错误。 不幸的是我失去了我的root密码。 服务器很关键,我想避免重新启动。 所以,没有sudo,没有根,没有重新启动,没有kdesudo或gksu。 服务器是运行在kvm上的虚拟机。
你将如何解决这个问题?
只是一个未经证实的想法:
在主机系统上,您可以访问客户分区的映像,对吧? 自使用以来,您无法轻松地安装该映像。 但是你不需要挂载分区来编辑单个文件。
在分区中查找sudoers文件扇区 – 或者使用文本search来查找sudoers文件中存在的一些短语,而不是频繁地出现在其他文件中,如# This file MUST be edited with the 'visudo' command as root. 也许你可能会使用一些GUIhex编辑器,或者我相信grep也可以在这里完成这项工作。
或者,也许你可以发现sudoers文件驻留在客户操作系统中的部门…
使用hex编辑器直接在磁盘上编辑文件,或使用dd – 复制扇区到文本文件,编辑它并将其复制回原始扇区。
困难:1.也许文件被caching在客户操作系统中,可能你会find一种方法来刷新caching。 2.通过文本search,你可能会发现几个文件看起来像你的sudoers,像删除它的版本,要么找出哪个是正确的,要么修复所有文件。
这不是一个通用的解决scheme,但是我把这个作为一个灵感来发布给同样的情况下的人。
我目前还没有访问过的解决scheme,但是我非常幸运能够访问以root身份运行的cron任务。 我使用该cron任务来运行另一个脚本,修复/etc/sudoers ,从现在开始,我将只使用visudo 。
所以如果你在这种情况下,cron任务可能会有所帮助。 没有停机/服务器重新启动,并没有风险搞乱与dd数据。
查找上次更新的date,然后从该date开始search根漏洞。
从一个真正的发行版像Ubuntu启动你的电脑; 挂载包含根目录的分区。 让我们假设分区是/ dev / sda2,你可以用它来挂载它
sudo mount /dev/sda2 /mnt
现在你做一个到/ mnt目录的chroot,
sudo chroot /mnt
现在你已经在你的硬盘上有效了。 您可以通过以下方式更改root用户的密码:
passwd passwd username
现在你已经重置了密码,修复sudoers文件非常简单:
pkexec visudo
它会要求你的密码。 严格来说,这需要使用PolicyKit进行授权。 你可以在这里find更多的信息。 总而言之,这比你想象的要容易得多。
幸运的是我们的服务器是虚拟服务器,我可以访问主机系统。 我已经通过编辑原始磁盘数据解决了这个问题。 你也可以尝试这种方式,但要非常小心。 该方法是危险的。 你可能会损坏另一个文件,分区,甚至整个硬盘。 所以要冒你的风险,并确保你有最近的备份。
sync 。 尝试用dd读取损坏的文本,并确保数字是正确的。 跳过=位置/ IBS。
sudo dd if = / dev / vg0 / vm-100-disk-1 count = 1 bs = 10 ibs = 10 skip = 1104162476
以某种方式覆盖损坏的文本来修复错误。 在我的情况下,我只是用'#'replace第一个符号来评论破碎的东西。 / obs / seek参数使用if / ibs / skip使用相同的数字。 小心换行符和eof。
回声“#includedir”| sudo dd = / dev / vg0 / vm-100-disk-1 count = 1 bs = 10 obs = 10 seek = 1104162476
你可以再读一遍,并检查你是否做了你所需要的。
回到vritual机器terminal,现在尝试使用sudo。 也许你需要以某种方式清空磁盘读取caching。 祝你好运! 🙂
我在Synology NAS设备上遇到类似的sudoers问题。
我的解决scheme是将以下命令放入“任务计划程序”
chmod 0755 /etc/sudoers
我设置为以root身份运行。
虽然我的问题是与权限有关,但我敢打赌,一个正确configuration的命令行系列的输出redirect将清除文件,并用一个基本的shellreplace内容,让你备份和运行。
就像是:
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