2

用户将通过 SSH 远程访问基于 ***nix 的机器,我需要确定检查他们当前使用的用户名是否在 /etc/sudoers 文件中具有 NOPASSWD 访问权限的最快方法。

可能的选项:

  • grep /etc/sudoers 中的用户名,解析命令提示符输出以确定它是否有 NOPASSWD,如果没有,删除该行然后附加新权限
  • 只需将权限字符串附加到文件即可(坏主意)。
  • 尝试 sudo 进入受保护的文件,看看它是否提示我输入密码。

我希望更容易一些,但我的 google-fu 没有提出任何答案。

4

2 回答 2

4

如果sudo -v成功,则用户已被授权使用sudo;如果失败,则用户没有被授权使用sudo.

# su user -c 'setsid sudo -v </dev/null'; 回声$?
[sudo] 用户密码:
1
# su root -c 'setsid sudo -v </dev/null'; 回声$?
0

如果没有setsidsudo即使 stdin/stdout/stderr 已全部重定向,也会尝试以交互方式询问密码。如果您没有控制终端,则不需要,但您可能需要su更改用户权限以外的其他内容,例如fork + setreuid

于 2009-07-15T20:01:04.900 回答
1

如果您确实需要“最快的方式”,我猜您正在构建一个可以处理许多并发请求的网络服务器。

这引发了另一个问题——并发问题。通常,许多进程读取和写入同一个重要文件是灾难的根源。

建立一个小的独立进程来处理任务。它应该有一个最小的接口来接收来自客户端的请求,以及/etc/sudoer文件的更新。has_NOPASSWD_access()类似于和的东西set_NOPASSWD_access()。它应该只在需要写入文件时才读取文件,因此您将大大减少处理请求所需的 I/O 时间。

优点 -

  • 快速:仅读取文件不需要 I/O,因为它自初始读取以来就存储在缓冲区中
  • 线程安全:只有一台服务器写入和读取 sudoer 文件
  • 单选原则——只有这个进程处理sudoer文件
  • 优雅(我希望):-)

缺点 - - 在评论中列出它们,我会添加。

于 2009-07-15T19:30:47.083 回答