具有sudoer权限的用户,可以在命令前加sudo使自己临时拥有root权限来执行该命令。一直以为Ubuntu添加sudoer用户很简单,只需改下/etc/sudoers配置。今天却遇到了难题,导致所有sudo命令都无法执行,花了好大的功夫才恢复过来。觉得有必要记录一下,分享给大家。

首先看下添加sudoer用户的方法:

  1. /etc/sudoers文件的写权限赋上

    $ sudo chmod u+w /etc/sudoers
    

    注意,这里是”u+w”。用”a+w”就会出问题,后面会讲到。

  2. 打开/etc/sudoers文件

    $ sudo vi /etc/sudoers
    
  3. 添加你要变为sudoer的用户(假设”bjhee”),可以加到root配置下面

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    bjhee   ALL=(ALL:ALL) ALL
    
  4. 如果你希望该用户输入sudo命令时,不用输密码,你可以将配置改为

    bjhee   ALL=(ALL:ALL) NOPASSWD:ALL
    
  5. 如果你希望所有的sudoer用户输入sudo命令时,都不用输密码,你可以将%sudo这一行的配置改为

    %sudo   ALL=(ALL:ALL) NOPASSWD:ALL
    

现在说下我遇到的问题。当我为/etc/sudoers文件赋上写权限时,使用了”a+w”

$ sudo chmod a+w /etc/sudoers

也就是所有用户都可以改此文件。从此执行任何sudo命令,都会报下面的错误:

sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

而且你想改回来都不行,因为无法sudo操作。查看网上资料,说进入root模式下即可恢复:

  1. 重启Ubuntu,并按”ESC”键,进入GRUB引导菜单

  2. 选择”Advanced options for Ubuntun”,然后选择”…recovery mode”

  3. 等待片刻,你会看到选项菜单,选择”root”,即可进入root模式 Recover Mode Root Menu

既然已经root了,应该什么都能做了吧。试下chmod将文件权限恢复,居然还报错,错误信息是:

chmod: changing permissions of '/etc/sudoers': Read-only file system

这是怎么回事,看来网上很多方案都不彻底。你需要执行下面的命令来以读写方式重新挂载文件系统,解决Read-only file system问题

$ mount -o remount rw /

然后chmod恢复/etc/sudoers权限,输入”exit”退出,选择”resume”选项重启系统。从此一起恢复正常了。

后记

后来又在网上看到一篇更简单的修改sudoer用户的方法。只需输入命令:

$ sudo visudo

就可以编辑sudoers文件了。编辑完后,按”Ctrl+O”保存,注意保存的文件要改为/etc/sudoers。确认保存输入”Y”,然后按”Ctrl+X”退出。这个方法看似安全多了,建议大家使用这个方法,就不用像我之前这么折腾了。