我知道它sudo commandX
会询问用户的密码,如果密码有效,它就会commandX
以 root 身份执行,直到这里一切正常。它对于某些命令是强制性的,例如apt
、等。出于安全原因chown
,chmod
它是有意义的。
现在考虑以下场景/情况:
sudo commandA
... sometime
sudo commandB
因为需要 root 权限,如果超时尚未到期,commandB
它将在不询问密码的情况下运行,否则必须重新写入密码。sudo
出于Shell Scripting
目的,-如果可以的话- 是否有一个命令可以检索/显示以下每种情况所请求的数据?
- 的超时
sudo
- 例如 N 分钟/秒,它应该来自根据/etc/sudoers
- 的剩余时间
sudo
(到期之前)。例如,如果超时为 5 分钟,则返回 4 或 3.5 - 的超时时间是否
sudo
已过
所以我假设总共有 3 个命令或 1 个带有特殊参数的命令来完成场景的目标
答案1
它sudo
是什么缓存您为每个用户、每个终端会话输入 5 分钟的凭据。
为此,它只是将包含该数据的条目写入 /run/sudo/ts/username (或timestampdir
sudoers 中指向的任何内容),并在下次运行时检查它sudo
。
任何其他有权访问该文件的程序(即需要以 root 身份运行)都可以读取相同的内容;文件格式在 中指定man sudoers_timestamp
。
可悲的是,制作一个setsuid
允许用户读取 sudo 内部文件的程序听起来是一个非常糟糕的主意,因为对于它提供的一点好处,它必须进行大量严格的极端情况检查,是的,用户检查该文件中的条目可以了解其他用户的 sudo 使用情况的属性。
所以,恐怕你想要的东西并不存在。您可以自己编写几行 C++ 代码,从该文件中提取上面提到的联机帮助页中描述的结构,并标记生成的可执行文件 setsuid,以便它始终可以作为 root 运行,但请注意,这听起来确实是一件危险的事情并且可能有更好的方法来完成您想要的任何事情。
答案2
您可以通过执行以下操作来获得情况 3 sudo -n true 2>/dev/null
-- 如果它具有非零状态,则缓存的身份验证已过期(或已被删除)。
答案3
请注意,这确实sudo -n true
可以告诉您身份验证是否已过期,但它还每次都会重置超时。