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

文章目录

    需求背景

    由于平时要频繁发布 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式