如何编辑无效的sudoers文件?它引发以下错误,并且不允许我再次对其进行修复。

这是发生的情况:

$ sudo visudo
>>> /etc/sudoers: syntax error near line 28 <<<
sudo: parse error in /etc/sudoers near line 28
sudo: no valid sudoers sources found, quitting


评论

考虑到此页面的重大问题会导致该错误help.ubuntu.com/community/RootSudoTimeout

相关:删除后可以重新安装sudo吗?

如果pkexec也无法正常工作,那么您可以足够惊奇地使用Docker。链接到serverfault的解决方案:serverfault.com/a/707514/590481我很抱歉在网上劫持评论。我没有足够的代表来正确回答。

#1 楼

在现代Ubuntu系统(以及许多其他GNU / Linux发行版)上,修复损坏的sudoers文件实际上非常容易,不需要重新启动,使用实时CD或对计算机进行物理访问。

要通过SSH执行此操作,请登录计算机并运行命令pkexec visudo。如果您具有对计算机的物理访问权限,则无需使用SSH;只需打开“终端”窗口并运行pkexec命令即可。

假设您(或某些其他用户)被授权使用PolicyKit以root的身份运行程序,则可以输入密码,然后它将以visudo的身份运行root,您可以修复/etc/sudoers

如果需要编辑/etc/sudoers.d中的一个配置文件(在这种情况下不常见,但是可以),请使用pkexec visudo -f /etc/sudoers.d/filename。 />如果遇到相关情况,必须以root用户身份执行其他系统管理命令来解决该问题(在这种情况下也不常见,但在其他情况下很常见),则可以使用pkexec bash启动交互式root shell。一般而言,您使用sudo运行的任何非图形命令都可以使用pkexec运行。那么对于其中任何一种操作,系统都会要求您选择要使用的操作,然后再要求输入密码。)


如果无效,例如,如果没有用户被授权通过PolicyKit以root身份运行程序,则从Ubuntu实时CD(例如您可能用来安装Ubuntu的CD)启动,然后为已安装的系统挂载文件系统。您可以通过运行root来查看分区,以实现此目的-可能只有一个ext4分区,这就是根文件系统。

假设已安装的Ubuntu系统的根文件系统位于sudo parted -l上。然后,您可以使用/dev/sda1进行安装。然后,您可以使用sudo mount /dev/sda1 /mnt编辑已安装系统的sudoers文件。或者,甚至更好的是,可以使用

sudo visudo -f /mnt/etc/sudoers


对其进行编辑(这将防止您使用错误的语法保存sudoers文件)。

评论


pkexec / usr / sbin / visudo在debian 7上工作

– marinara
2014年5月5日在1:33

天啊!非常感谢!救了我的培根。根据建议,使用常规文本编辑器在etc / sudoers.d /目录中添加了文件(D-O-N-T__D-O__T-H-A-T !!!)。丧失了所有提升特权(包括编辑有问题的文件)的能力。这有助于编辑文件。不过很奇怪,我必须先编辑/ etc / sudoers,然后它在另一个文件中发现了错误,并为我打开了它。即使是WEIRDER,/ etc / sudoers文件'inlcudedir /etc/sudoers.d'中的指令也已被注释掉,并且仍然包含该指令。

–丹尼斯
2015年4月5日,凌晨3:15

@Dennis有点令人困惑,特别对待sudoers文件中的#include指令;在这种情况下,前导#不会导致该行的其余部分被解释为注释。正如man sudoers所说:“井号('#')用于表示注释(除非它是#include指令的一部分,否则除非...”),另请参见visudo:#includedir sudoers.d(从lzone归档。 de / blog)。

– Eliah Kagan
2015年4月5日在3:49

我的用户是sudoer,但出现此错误:以其他用户身份执行命令时出错:未授权

– SuB
16-10-30在10:05

在Ubuntu 16.04中,pkexec visudo要求输入密码,该密码不接受正确的密码。它将引发“ AUTHENTICATION FAILED”错误。

– Juha Untinen
18年8月14日在9:30

#2 楼

始终使用visudo编辑您的sudoers文件,切勿直接直接编辑它。除非经过验证,否则它将阻止您将其保存到磁盘。

评论


后见之明是20/20

– code_monk
2015年1月9日,下午1:57

它不会预防灾难。有效地否认自己很容易。

–约书亚
2015年10月5日在22:02

脚本可以使用visudo吗?如果是这样,怎么办?

–卢卡斯
16年7月7日在15:01

我没有安装visudo。所以我做了pkexec vim。然后显示用户列表,并要求输入密码。当我提供密码时,它将引发错误“作为另一个用户执行命令时出错:未授权”。请帮忙

– Shyamkkhadka
18年5月24日在5:48

#3 楼

输入:

pkexec visudo


然后更改最后一行

#includedir /etc/sudoers


收件人:

#includedir /etc/sudoers.d


它可以解决您的问题。

评论


我注意到,从#includedir中删除开头的#会导致语法错误,至少在Ubuntu 12.10上,#是指令的一部分。

– SAFX
2013年4月5日在2:46

那简直让我头疼。万分感谢 :)

– Addo解决方案
17年7月16日在18:29

我没有安装visudo。所以我做了pkexec vim。然后显示用户列表,并要求输入密码。当我提供密码时,它将引发错误“作为另一个用户执行命令时出错:未授权”。请帮忙

– Shyamkkhadka
18年5月24日在5:48

#4 楼

如果像我这样的人没有安装pkexec,或者无法运行vi,visudo,nano或任何其他编辑器来更改sudoers文件,则可以确定使用此过程。

重新启动
引导时按住Shift键以具有恢复模式选项(输入)
以root身份输入命令行(我的grub菜单中的倒数第二个选项)

重新安装rw的启动设备,并为用户应用exec权限,并编辑文件。 br />

评论


虽然@ eliah-kagan建议的pkexec解决方案似乎更简单,但这一解决方案更为通用。事实证明,在我的机器上没有安装pkexec,我当然无法安装它,因为sudo apt-get install pkexec某种程度上无法正常工作。

–running.t
2015年10月15日14:06

同样在这种方法中,我将使用visudo代替nano / etc / sudoers。

–pa4080
18/12/3在12:38

#5 楼

如果弄乱了sudoers文件,则需要:


重新引导进入恢复模式(在引导过程中按Escape键,在grub屏幕上选择恢复模式选项)
选择“启用网络连接”选项(如果您不将文件系统安装为只读文件,谁知道。)
选择“拖放到根外壳程序”选项
运行visudo,修复文件
使用常规grub选项重新启动

源:-http://mario.net.au/content/recover-etcsudoers-ubuntu-1204

评论


嗨,它会删除现有系统的iptables文件吗?

– Shyamkkhadka
18年5月24日在7:48

#6 楼

#include sudoer.d
没错,删除#include sudoer.d不会有任何区别。

但是请确保您没有任何语法错误。
我遇到了同样的问题,但是花了几个小时进行修复,才发现它们是语法错误。
请参阅

例如
说您的用户名是:dolly
我使用了以下错误的信息

 dolly ALL = (ALL) ALL NO PASSWD: ALL

< br正确的语法是

dolly ALL = (ALL) ALL //give permission to everything, not good




dolly ALL=(ALL) NOPASSWD:/usr/bin/thurderbird //good, give specific permission


希望这会有所帮助

评论


与确保没有语法错误相比,一种更好的方法是在编辑这些文件时始终使用visudo,这可以确保在修改文件之前没有语法错误。 visudo不仅用于编辑/ etc / sudoers,还将在/etc/sudoers.d中创建和编辑文件。它也可以与您想要的任何文本编辑器一起使用。有关详细信息,请参见手册页。

– Eliah Kagan
2012年7月3日,0:12



至于授予特定权限,请注意,这仅对非常简单的命令/应用程序有用,因为任何足够复杂的应用程序(包括雷鸟,无论如何都不应以root身份运行)将以有效的方式为用户提供完全的系统访问权限。甚至看似简单的功能也为完全root访问打开了大门。例如,可以运行可以将文件以root身份保存到任意位置的程序的用户可以获得完全root访问权限(他们可以安装自己的/ etc / sudoers,或者如果语法限制阻止安装,则他们可以安装自己的/等/ crontab)。

– Eliah Kagan
2012年7月3日,0:16

#7 楼

运行恢复模式,然后键入以下内容:
chown -R root:root /etc/sudoers.d
chmod u=rwx,g=rx,o=rx /etc/sudoers.d/
chmod u=r,g=r,o= /etc/sudoers.d/*


#8 楼

您还可以使用Ctrl + Fn(Fn从1到6)以root用户身份在tty控制台上登录并运行visudo

#9 楼

pkexec visudo


然后恢复您的错误

评论


不必使用pkexec

–脑袋
2014年1月1日12:01

@Braiam visudo必须以root用户身份运行。如果sudo不起作用,则pkexec有时会起作用。这是我先前的答案所涵盖的内容...但是它是一个正确的答案,仅靠visudo(当不是root用户运行时)是行不通的,即使他们的建议与其他答案有相当多的重叠,正确的简短答案也可能有价值。当然,如果进入恢复模式,那将是root shell,那么pkexec之类的命令就不需要sudo或visudo了。也许那就是你的意思

– Eliah Kagan
2014年3月29日5:30



#10 楼

您也可以在grub中编辑启动项。

只需重新启动PC,然后等待grub显示。然后在“ Ubuntu”条目上按“ e”进行编辑。 。

,然后按F10键启动此临时修改的启动项。像nano / etc / sudoers一样回到其先前状态。

然后重新启动并完成。

#11 楼

在VirtualBox上运行的Ubuntu 16.04中(不应有所作为),上述方法对我不起作用(文件末尾的无效行)。起作用的是:


重新启动VirtualBox
使其正常启动,直到在控制台中要求您输入用户名和密码
用您的用户名正常登录
然后当您进入控制台时(前提是您的设备没有引导到GUI中),只需输入命令su -,然后输入您自己的用户名密码。如果root@ubuntu-xenial:~#不太破损或为空。不知道在那种情况下会发生什么。
然后您可以简单地运行/etc/sudoers并修复文件。
然后visudo会提示您保存修改后的缓冲区。按Ctrl + XY

重新启动该框,它现在应该可以工作。地雷:

Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

root ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL

%sudo ALL=(ALL:ALL) ALL


评论


您的第4步没有意义,仅当您的root密码与普通用户相同时才起作用。

–阿尔弗雷德
19年8月3日,12:47

这在本地VM中非常常见。

– Juha Untinen
19年8月3日在16:37

#12 楼

良好做法:备份终端窗口,然后在其中运行sudo su。在另一个终端上,运行visudo或sudo vim / etc / sudoers。如果有任何问题,请返回到第一终端并修复文件。您可能会问,为什么不在一个终端中先运行sudo su?这也可以正常工作,但是在您不了解终端之前将其关闭的风险更高。

#13 楼

为基于WSL的Linux VM新潮流添加了此功能。当我将自己锁定在没有pkexec并且未设置root密码的基于Debian的WSL2 VM(Pengwin)时,这是我找到的解决问题的方法:


打开Windows Powershell作为管理员(右键单击“以管理员身份运行”)
按照以下方法,将虚拟机上的默认用户设置为root用户(因为它不会要求输入密码):

<distro.exe> config --default-user root


示例:

ubuntu1804.exe config --default-user root 




pengwin.exe config --default-user root



重新启动发行版。
您现在应该是root用户,可以解决sudo问题。
重复此过程,将默认用户恢复为正常。 >

#14 楼

当这种情况发生在非GUI系统(可能是您的生产服务器)上时,pkexec失败并显示以下错误消息:

polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized


在这种情况下,使用pkttyagent会有所帮助。如果要删除sudoers.d目录中的损坏文件,请使用以下命令:

pkttyagent -p $(echo $$) | pkexec rm /etc/sudoers.d/FILENAME


如果要恢复默认值/etc/sudoers,则可以使用此要点复制默认值配置,将其放置在非root用户访问的位置(例如$HOME)。然后,您可以覆盖您的sudoers文件:

pkttyagent -p $(echo $$) | pkexec cp ~/sudoers /etc/sudoers


注意:使用这种方法,在运行命令之后,对外壳的访问可能会丢失。但是我敢肯定,失去一个shell会话要比失去服务器好得多! (根据联机帮助页,这是正常行为:当不再需要其服务时,可以终止该进程。)

评论


非常感谢!

–pat-s
20 Dec 1'在14:32

#15 楼

有一种更简单的解决方案。如果没有重新启动,恢复模式或pkgexecpkgexec无法正常工作,也不知道为什么或如何使用它),只需执行以下操作: > su root # switch to root user, without using sudo (which is broken at this point) your_favorite_editor /etc/sudoers # e.g. nano

,然后修复语法错误!

评论


下票是什么?为我完美地工作。

–rien333
19年8月8日在13:29

这个答案实际上是有效的。我不知道为什么要投票!

–麦克莱恩
19年11月25日在18:48



我建议downvote应该附带一个解释。否则,人们会利用它,甚至更糟的是,不允许给出有效答案。

–麦克莱恩
19年11月25日在18:50

我认为,downvote来自运行此命令的地方,要求root拥有密码,默认情况下不需要。

–阿里投
20 May 20'上午0:07

嗯,所以事实是它不适用于ubuntu。一般而言,该板上的许多问题都适用于linux,但是,我经常无法考虑发行版的差异(当然,这是搜索此问题时google上出现的主要内容)。

–rien333
20-05-20在8:44