这是发生的情况:
$ 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
#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 + X
和Y
重新启动该框,它现在应该可以工作。地雷:
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 楼
有一种更简单的解决方案。如果没有重新启动,恢复模式或pkgexec
(pkgexec
无法正常工作,也不知道为什么或如何使用它),只需执行以下操作: > 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
评论
考虑到此页面的重大问题会导致该错误help.ubuntu.com/community/RootSudoTimeout相关:删除后可以重新安装sudo吗?
如果pkexec也无法正常工作,那么您可以足够惊奇地使用Docker。链接到serverfault的解决方案:serverfault.com/a/707514/590481我很抱歉在网上劫持评论。我没有足够的代表来正确回答。