如何确定我的 sudoer 权限是否超时?

Ton*_*llo 21 sudo

我正在编写一个脚本,该脚本以 sudo 身份运行命令并仅在我的 sudo 权限超时时回显一行文本,因此只有在使用 sudo 运行命令时才需要我的用户(不是 root)再次输入其密码。

我如何验证?请注意,$(id -u)即使以 sudo 身份运行也会返回我当前的用户 ID,因此无法检查以将其与 0...

我需要一种可以安静地检查这一点的方法。

Ale*_*exP 29

使用该选项-n检查您是否还有权限;来自man sudo:

-n , --非交互式

避免提示用户进行任何类型的输入。如果命令运行需要密码,sudo 将显示错误消息并退出。

例如,

sudo -n true 2>/dev/null && echo Privileges active || echo Privileges inactive
Run Code Online (Sandbox Code Playgroud)

请注意,权限可能会在检查sudo -n true和实际使用它们之间过期。您可能想直接尝试sudo -n command...并在失败的情况下显示一条消息,并可能以sudo交互方式重试运行。

编辑:另请参阅下面 ruakh 的评论。

  • 回复:“请注意,在检查 `sudo -n true` 和实际使用它们之间权限可能会过期”:文档在这一点上有点含糊,但我*认为*运行 `sudo`命令,即使只是`sudo -n true`,也会重新设置超时时钟。无论哪种方式,`-v` 都被明确记录为这样做,并且无论如何,`sudo -n -v` 可能比 `sudo -n true` 更合适。 (3认同)

jay*_*ren 9

跑:

sudo -nv
Run Code Online (Sandbox Code Playgroud)

如果您的 sudo 权限已超时,这将以退出代码 1 退出并输出:

sudo: a password is required
Run Code Online (Sandbox Code Playgroud)

如果您有有效的缓存凭据,此命令将成功并且不输出任何内容。

因此,总而言之,这里有一个脚本小程序,它会静默检查您是否拥有有效的缓存凭据:

if sudo -nv 2>/dev/null; then
  echo "no sudo password required"
else
  echo "sudo password expired"
fi
Run Code Online (Sandbox Code Playgroud)

正如其他答案/评论所提到的,-v如果有任何或其他提示进行身份验证以生成缓存的凭据,则 sudo的选项(“验证”)会静默更新缓存的凭据,并且-n选项(“非交互式”)会阻止 sudo 生成任何交互式提示,例如身份验证提示。