如何修改无效的“ / etc / sudoers”文件?


238

如何编辑无效的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

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

Answers:


361

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

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

假设您(或某些其他用户)被授权可以像rootPolicyKit 一样运行程序,则可以输入密码,然后密码将以visudo身份运行root,并且可以修复/etc/sudoers

如果需要编辑其中一个配置文件/etc/sudoers.d(在这种情况下不常见,但是可以),请使用。pkexec visudo -f /etc/sudoers.d/filename

如果遇到相关情况,您必须以root用户身份执行其他系统管理命令来解决该问题(在这种情况下也不常见,但在其他情况下很常见),则可以使用来启动交互式root shell pkexec bash。一般来说,sudo可以使用您运行的任何非图形命令pkexec

(如果系统上有多个用户帐户被授权像rootPolicyKit 一样运行程序,那么对于其中任何一种操作,在要求您输入密码之前,系统都会要求您选择要使用的帐户。)


如果这不起作用(例如,如果没有用户被授权通过PolicyKit以root身份运行程序),则从Ubuntu live CD(例如您可能用来安装Ubuntu的CD)启动,并为该文件挂载文件系统。已安装的系统。您可以通过运行sudo parted -l以查看分区来做到这一点-可能只有一个ext4分区,这就是根文件系统。

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

sudo visudo -f /mnt/etc/sudoers

(这将防止您使用错误的语法保存sudoers文件)。


7
pkexec / usr / sbin / visudo在debian 7上工作
marinara 2014年

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

4
@Dennis有点令人困惑,#includesudoers文件中的指令进行了特殊处理;#在这种情况下,前导不会导致该行的其余部分被解释为注释。如前所述man sudoers:“井号('#')用于表示注释(除非它是#include指令的一部分,否则除非...”),另请参见visudo:#includedir sudoers.d(来自lzone.de/博客
利雅卡根

5
我的用户使用sudoer,但出现以下错误:以其他用户身份执行命令时出错:未授权
SuB 2016年

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

54

始终用于visudo编辑您的sudoers文件,切勿自己直接对其进行编辑。除非验证,否则它将阻止您将其保存到磁盘。


17
后视是20/20
code_monk

4
它不会预防灾难。有效地拒绝自己很容易。
2015年

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

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

24

输入:

pkexec visudo

然后更改最后一行

#includedir /etc/sudoers

至:

#includedir /etc/sudoers.d

它应该可以解决您的问题。


2
我注意到,除去最主要##includedir原因语法错误,#则是其中的一部分,至少在Ubuntu 12.10。
SAFX 2013年

1
那简直让我头疼。感谢一吨:)
Addo Solutions

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

11

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

  • 重启
  • 引导时按住Shift键可选择恢复模式(输入)
  • 以root身份输入命令行(我的grub菜单中的倒数第二个选项)
  • 重新安装rw的启动设备,并为用户应用exec权限,然后编辑文件

    mount -n -o remount,rw /
    chmod u+x /etc/sudoers
    nano /etc/sudoers
    

解决这个错误,并开心:)


虽然@ eliah-kagan建议的pkexec解决方案似乎更简单,但这一解决方案更为通用。在我的机器上,事实证明没有安装pkexec,我当然不能安装它,因为sudo apt-get install pkexec不起作用。
running.t

同样在这种方法中,我会visudo改用nano /etc/sudoers
pa4080 '18 / 12/3

7

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

  • 重新启动进入恢复模式(在启动过程中按Escape键,在grub屏幕上选择“恢复模式”选项)
  • 选择“启用网络连接”选项(如果不这样做,则文件系统将以只读方式挂载。谁知道)
  • 选择“拖放到root shell”选项
  • 运行visudo,修复文件
  • 使用普通的grub选项重启

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


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

6

#include sudoer.d删除#include sudoer.d并没有什么问题。

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

例如,说您的用户名是:doll,我用了以下哪个是错误的

 dolly ALL = (ALL) ALL NO PASSWD: ALL

正确的语法是

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。它也可以与您想要的任何文本编辑器一起使用。有关详细信息,请参见手册
伊利亚·卡根

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

3

运行恢复模式,然后输入

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/*

只有组和用户root必须具有privelege权限


3

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


2

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

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

查找带有“ linux =”或“ kernel =”的行,并在该行的末尾添加一个“单”。

然后按F10键启动此临时修改的启动项。这将为您提供具有根权限的Shell(无GUI),并且您可以使用s.th编辑sudoers文件。像nano / etc / sudoers一样回到原来的状态。

然后重新启动并完成。


2
pkexec visudo

然后恢复你的错误


1
无需使用pkexec
Braiam'1

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

0

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

  1. 重新启动VirtualBox
  2. 让它正常启动,直到在控制台中询问您的用户名和密码为止
  3. 使用您的用户名正常登录
  4. 然后,当您进入控制台时(前提是您的设备没有引导到GUI中),只需输入命令su -,然后输入您自己的用户名密码即可。
  5. 现在root@ubuntu-xenial:~#,如果/etc/sudoers不是太破损或为空,则应该以提示结束。不知道在那种情况下会发生什么。
  6. 然后,您可以简单地运行visudo并修复文件。
  7. 然后Ctrl + X,它将提示保存修改后的缓冲区。按YEnter
  8. 重新启动该框,它现在应该可以工作了。

如果您/etc/sudoers是空的或缺少某些东西,并且可以对其进行编辑,那么这是我的内容:

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密码与普通用户相同时才起作用。
阿尔弗雷德

这在本地VM中非常常见。
Juha Untinen

0

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


-1

有一种更简单的解决方案。如果没有重新启动,恢复模式或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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.