在 Linux 或类似 Unix 的系统上,如何在没有密码的情况下使用 sudo 命令?
/etc/sudoers 格式
<username> ALL=(ALL) ALL
%<groupname> ALL=(ALL) ALL
<username> ALL=(ALL) NOPASSWD: ALL
%<groupname> ALL=(ALL) NOPASSWD: ALL
<username> ALL=(ALL) NOPASSWD: <cmd-abs-path1>, <cmd-abs-path2>, <cmd-abs-path3>
%<groupname> ALL=(ALL) NOPASSWD: <cmd-abs-path1>, <cmd-abs-path2>, <cmd-abs-path3>
Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
...
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
@includedir /etc/sudoers.d
配置步骤
- 备份 sudoers 文件
sudo cp /etc/sudoers /root/sudoers.bak
- 进入 sudoer 交互命令
$ visudo
或
$ sudo visudo
- 在
/etc/sudoers
文件中,在名为xiexianbin
的用户添加/编辑以下行,以运行/bin/kill
和systemctl
命令:
xiexianbin ALL=NOPASSWD:/bin/systemctl restart httpd.service,/bin/kill
或
cat >> /etc/sudoers.d/xiexianbin << EOF
xiexianbin ALL = (root) NOPASSWD:ALL
EOF
- 保存退出
测试
运行 /bin/kill
时并不需要输入密码即可杀掉进程:
$ sudo /bin/kill <pid>
重启服务也不需要数据密码
$ sudo /bin/systemctl restart httpd.service
F&Q
sudo must be owned by uid 0 and have the setuid bit set
执行 sudo 命令报错:
$ sudo xxx
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
su 登录 root 用户,执行命令
chmod 4755 /usr/bin/sudo
chmod 755 /usr
- 未知 root 密码,采用 recovery 模式恢复
sudo 执行命令 env 不生效问题
原因:/etc/sudoers
配置了 env_reset
默认重置环境变量(安全原因)
解决方法:参考
方法一:可以修改为 Defaults !env_reset
即可实现不重置环境变量
$ cat /etc/sudoers | grep env_reset
Defaults env_reset
方法二:在 ~/.profile
或 ~/.bashrc
中使用 alias
添加环境变量,重新退出后执行即可生效。示例如下
export ABC="abc"
alias sudo='sudo env ABC=$ABC'
ansible 执行时报错:sudo with NOPASSWD
在 /etc/sudoers
配置用户时,添加 NOPASSWD
即可
admin ALL=(ALL) NOPASSWD:ALL,!/bin/su,!/usr/bin/chattr