sudoers, 非 root 用户远程免密码执行需要 sudo 权限的命令

更新日期: 2024-11-07 阅读次数: 312 字数: 512 分类: Linux

需求背景

由于平时要频繁发布 golang 的程序到线上生产服务器,我通过 Makefile 自动执行编译,scp 可执行文件到服务器。但是无法自动远程执行 systemctl 的 restart 命令,因为 systemd 相关的命令需要 sudo 权限。

所以,最后一步总是需要登录到服务器上,然后手动执行 sudo systemctl restart xxx.service,然后输入密码,非常的浪费时间。

我想找个方案,能给当前用户增加 sudo 权限,同时为了安全起见,又能限制住只可以执行部分指定命令时有此权限。

解决方案 sudoers

发现 sudoers 完美满足需求。查看 sudoers 的介绍:

man sudoers

sudoers — default sudo security policy plugin. The sudoers policy plugin determines a user's sudo privileges. It is the default sudo policy plugin. The policy is driven by the /etc/sudoers file or, optionally, in LDAP.

没想到还能通过 LDAP 来控制,这也太专业了。

visudo

需要使用 visudo 命令来编辑 /etc/sudoers 配置文件。注意,⚠️一定不要直接通过 vim 编辑 /etc/sudoers 文件,一定格式被破坏,无法修复。

编辑 /etc/sudoers.d 目录下的文件

同样的,也不能直接编辑子目录中的文件,也需要 visudo

sudo visudo -f /etc/sudoers.d/file_to_edit

具体操作

新建一个配置文件:

sudo visudo -f /etc/sudoers.d/some_name

配置内容:

myuser ALL=(root) NOPASSWD: /usr/bin/systemctl

myuser 替换为登录服务器的用户名。

测试

果然,现在通过 ssh 远程执行 sudo systemctl stop/start 命令时,不再需要输入密码了。

而 apt install 之类的命令还是需要输入密码。跟预期一致。

sudoers 配置格式说明

上面的配置对应下面的格式:

User Host = (Runas) Command

即:

“User may run Command as the Runas user on Host”.

参考

  • https://unix.stackexchange.com/questions/18830/how-to-run-a-specific-program-as-root-without-a-password-prompt
  • https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file#how-to-give-a-user-sudo-privileges

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式