我有一个用户帐户,该帐户不是为交互式登录而设计的,但希望允许它运行单个命令(以 root 身份)。有没有比我现在更好的方法来实现这一点(不授予比我打算更多的权利):
- 将他们的 shell 更改为 rbash,并将 sudo 作为其路径中唯一的可执行文件,因为他们需要有效的 shell 才能运行任何命令。
- 使用“ALL=(root:root) NOPASSWD: /sbin/executable”将他们的帐户添加到 sudoers
- 使用 no-{X11,port}-forwarding,no-pty,command="sudoexecutable" 为帐户添加authorized_keys条目
上下文:我试图授予非 *nix 精通的经理在我离开时修复任何打印服务器问题的能力。显然,第一个调用端口是 CUPS Web 界面,并亲自走过去检查打印机(他现在可以而且确实这样做了),但我不能指望他在失败时通过 ssh 登录并重新启动相应的服务(并且不无论如何,相信他有不受限制的 sudo 访问权限)。目前,我只是授予他运行 /sbin/reboot 的权限,我会将其更改为重新启动 cups/samba/etc 的脚本。相反,当我有机会时。
答案1
如果您想避免与服务器进行任何其他可能的交互,一种方法是使用您的命令创建一个专用帐户作为连接 shell。例如,用户“reboot”的 uid 0 和 /sbin/reboot 作为连接 shell。
shell可以是一个脚本菜单,授权在选项之间进行选择;这样你就可以使用 sudo 并避免帐户的 UID 0
1) Purge the print jobs
2) Restart cups
3) Reboot
4) Quit
Enter your choice:
菜单脚本在这里
在 StackOverflow 上使用 bash select 函数的更简单的示例
更好地使用个人 ssh 密钥进行身份验证,这样您就知道谁正在重新启动服务器。
答案2
我这样做的方式是运行一个由 root 执行的 web-server-script*,并且只执行您需要的命令(例如 Emmanuel 提出的菜单)。然后,您可以使用密码或防火墙来保护它,以限制谁可以访问它。
*网络服务器脚本:可以是一个小的 Perl 脚本(使用 HTTP::Daemon),小型java网络服务器,或其他任何东西,在非通用端口(例如高于 1000)中运行。