需求背景
由于平时要频繁发布 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 聊聊, 查看更多联系方式