(最初发布在 Stack Overflow 上)。他们建议我尝试一下这里。以下是原始帖子:
参见标题。我想要一个允许我查询 sudo 的命令。理想情况下,如果我仍然有 sudo,它会返回成功,如果 sudo 已过期,它会返回 false。获取剩余时间可能也很有用(尽管如果我担心,我可以sudo -v
重新验证。)哦,它不应该要求输入密码。
我发现最接近的是sudo -n true
,但该-n
选项仅在我工作的 Centos 5 机器上存在。-n
如果它必须要求输入密码,则会失败。还有其他方法可以获得此功能吗?假设我实际上并没有在我使用的所有机器上拥有 root 权限,因此我无法根据自己的喜好安装新版本的 sudo。
不管怎样,我这样做是为了让我的提示符显示 sudo 状态。我喜欢知道哪些终端可以主动使用 sudo。当我是 root 时,我还有一个会改变颜色的提示符,但我不经常使用 root,所以用处有限。
答案1
该-n
选项在较新版本的 中可用sudo
,但正如您所说,这不是一个选项。除了尝试sudo
并查看它是否返回密码提示之外,没有其他实际方法可以完成您想要的操作。如果您担心的是您想要一个视觉指示,为什么不启动 do 来sudo /bin/bash
启动 root bash 会话?请注意,这是不安全的,但如果有人意识到您在 sudo 上的提示更改,这也有点不安全。
答案2
我知道这是一个非常老的问题,但这是我今天在脚本中做的。假设 sudo 意味着能够以 sudo 身份运行任何命令(或者至少是 uptime)
CAN_I_RUN_SUDO=$(sudo -n uptime 2>&1 | grep "load" | wc -l) 如果[${CAN_I_RUN_SUDO} -gt 0] 然后 echo“我可以运行 sudo 命令” 别的 echo“我无法运行 Sudo 命令” 菲
但是,如果您的用户有限制visudo
,则此检查将不够,例如,如果您的用户只能使用 make 命令。请尝试运行一些您知道可以正常工作的命令。
您可以添加过滤器grep -v Sorry
,例如:
$(sudo -n uptime 2>&1 | grep "load" | grep -v Sorry | wc -l)
以避免这些误报。
答案3
为了简化@wags007 给出的答案
if sudo -n true
then
sudo id
else
echo "sorry, but did not want to bother you"
fi
然而,如果在你的https://www.sudo.ws/man/1.8.15/sudoers.man.html您的配置中,defaults mail_badpass
每次测试结果为 false 时都会发送一封邮件(会提示)。为了避免这种麻烦,请将 sudoers 文件中的该部分更改为
Defaults mail_badpass
Defaults! /bin/true !mail_badpass
因此,除 /bin/true 之外的所有命令都会发送安全警报邮件。是的,现在有人可以通过sudo true
无限次调用来尝试暴力破解密码,而不会发送任何安全警报邮件。
注意:请始终使用visudo
而不是您喜欢的编辑器来编辑 sudoers 文件。否则,您可能会被锁定。
答案4
根据 sudo 手册,sudo 会话是根据时间戳文件 ( /usr/lib/sudo/<username>
) 确定的,因此您可以通过检查时间戳文件的日期/时间来确定剩余时间。但是,在我的系统中,时间戳文件实际上是一个目录,其中有三个文件包含神秘的内容(还有一些奇怪的时间戳,但似乎/usr/lib/sudo/<username>
有一个时间戳与我给 sudo 密码的时间一致。我认为/usr/lib/sudo/<username>/0
有最近一次执行的时间戳sudo
。