为什么我必须使用'visudo'来编辑'/etc/sudoers'文件?

在/etc/sudoers文件中,它说:
# This file MUST be edited with the 'visudo' command as root.

我的问题是,为什么必须使用visudo编辑此文件?
看起来我可以通过发出以下命令成功地使用gedit编辑该文件:
sudo gedit /etc/sudoers

如果我能用gedit编辑它,为什么还要使用visudo?
3个回答

使用visudo更安全。你可以直接编辑/etc/sudoers,但如果你在那里打错字,你将无法再使用sudo,也无法修复错误。

visudo会锁定sudoers文件,防止多个同时编辑,提供基本的健全性检查,并检查解析错误。

你可以通过以下方式了解更多:

man visudo

谢谢!如果你不介意,我有一个离题的问题:sudoers 文件中的 #% 有什么区别?它们都用来表示注释吗? - Tosh
4只有#是注释。%用于组。如果你不知道文件格式,绝对不应直接编辑sudoers文件。 - Pilot6
再次感谢。我必须按照这里的说明进行操作:http://winscp.net/eng/docs/faq_su。 - Tosh

当你使用visudo时,如果你成功引入了语法错误,visudo会直接退出并提示"现在怎么办?",但是它不会在屏幕上给出任何选项。
然而,在visudo manpage中列出了这些选项。
visudo解析sudoers文件在编辑后,如果存在语法错误,则不会保存更改。发现错误时,visudo将打印一条消息,指出错误发生的行号,并提示用户“现在怎么办?”此时,用户可以输入“e”重新编辑sudoers文件,“x”退出而不保存更改,或者“Q”退出并保存更改。应该非常小心地使用“Q”选项,因为如果visudo认为存在解析错误,sudo也会这样认为,直到错误被修复之前,没有人能够再次使用sudo。如果在检测到解析错误后键入“e”以编辑sudoers文件,光标将定位在发生错误的行上(如果编辑器支持此功能)。
然而,这段文字实际上是一堵墙,不太直观。
为了避免混淆,如果您遇到语法错误,我建议您在您的~/.bashrc(或从~/.bashrc源自的其他文件)中定义以下函数。
# Improved visudo command
editsudo () {
  echo "Valid options at the 'What now?' prompt:"
  echo "  e : Re-edit the sudoers file"
  echo "  x : Exit without saving the changes"
  echo "  Q : Quit and save changes (NOT recommended)"
  sudo visudo
}

现在这有两个优点:
  1. 命令editsudo确保运行sudo visudo(所以更短)。
  2. 命令editsudo首先打印帮助文本,这样如果你因错误退出,你就可以在上面找到相关信息。

直接从权威消息源来说,man visudo

visudo以安全的方式编辑sudoers文件,类似于vipw(8)。 visudo锁定sudoers文件,防止多个同时编辑,提供基本的健全性检查,并在安装编辑后的文件之前检查语法错误。如果当前正在编辑sudoers文件,则会收到一条消息,请稍后再试。

visudo在编辑后解析sudoers文件,如果存在语法错误,则不保存更改。发现错误时,visudo将显示指出错误发生位置的行号,并提示用户“接下来怎么办?”[...]