是的,推荐用于visudo
编辑 sudoers 文件。但我不满足于口头推荐。当我以错误的方式编辑文件时,shell 可以发出警告或要求确认吗?
我想抓住以下情况:
$ sudo vim /etc/sudoers
/etc $ sudo nano sudoers
$ sudo cp what/ever/file /etc/sudoers.d/a
答案1
注意:我不会做以下事情。它不安全,而且还有足够多的其他可能性来破坏您的系统。为什么要选择这个呢?
权利越大sudo
,责任越大。
但是,为了避免root
编辑sudoers
文件,您可以通过运行以下命令使其不可变:
sudo chattr +i /etc/sudoers
然后将以下别名添加到您的.rc
或.profile
文件中,例如.bashrc
:
alias visudo="sudo chattr -i /etc/sudoers; sudo visudo; sudo chattr +i /etc/sudoers;"
alias sudo='sudo '
它将更改visudo
命令以首先重置不可变标志,然后运行visudo
,最后immutable
再次执行。看这里为什么我们需要第二个别名。
资源文件或重新启动 shell 后,您可以sudo visudo
正常使用,但不能以其他方式编辑它。
这只是一般想法,需要对其进行增强以启用visudo
和下面文件的其他参数/etc/sudoers.d/
。您还可以使用函数或脚本来代替别名。
请注意,这并不真正安全:
- 当你
visudo
运行的时候,文件不是一成不变的 - 任何
sudo
用户都可以chattr -i
随时运行以取消设置不可变标志 - 你训练自己一种在做事之前不思考的行为
答案2
我在这里提出我的尴尬解决方案。我正在使用 zsh,它是一个 zsh 小部件(命令行插件)。
当当前目录为sudoders.d
,或者命令行包含 时sudoers
,zsh 会给出警告,除非命令是“cd”或“visudo”。
代码涵盖了 vim、nano、cp、rm、cat > 等场景。
我相信你可以做得更好,但这是基本的想法。
#! /usr/bin/zsh
function catchEditSudoers {
if ([[ $BUFFER =~ .*sudoers.* ]] && [[ ! $BUFFER =~ .*visudo.* ]] && [[ ! $BUFFER =~ "cd .*" ]]) ||
([[ $PWD =~ ".*/sudoers.d" ]] && [[ ! $BUFFER =~ .*visudo.* ]] && [[ ! $BUFFER =~ "cd .*" ]]); then
zle -R "It's recommanded to use visudo to edit sudoers. Continue anyway? (y/n)"
read -k reply
if [[ $reply == y ]]; then
zle accept-line
else
zle send-break
fi
else
zle accept-line
fi
}
zle -N catchEditSudoers_widget catchEditSudoers
bindkey '^M' catchEditSudoers_widget
在 .zshrc 中获取文件。