如何检查此终端会话是否已输入sudo密码?


16

如标题中所述,我需要检查是否已在Shell中为此终端会话输入了sudo密码(又名,如果我现在拥有sudo权限)。

如果我有它,我想做一件事,如果我没有它,那它不应该提示我,而是让我做另一件事。

因此,在伪代码中,它看起来像这样:

if (sudo = true)
   echo "i got sudo"
else
   echo "i dont have sudo"
fi

但是我为此找到的所有命令总是在尝试检查时提示我输入sudo密码。

基本思想是该脚本可以(并且会)在多个地方询问sudo密码,但我不想打印出来“该脚本现在将询问您的sudo密码。” 如果已经输入(这意味着它不会要求输入sudo密码)。

希望可以有人帮帮我。

Answers:


21

您可以使用:

if sudo -n true 2>/dev/null; then 
    echo "I got sudo"
else
    echo "I don't have sudo"
fi

-n(非交互式)选项阻止sudo从提示用户输入密码。如果需要密码才能运行该命令,sudo将显示一条错误消息(重定向至/dev/null)并退出。如果不需要密码,那么这个表达式为true: sudo -n true 2>/dev/null


4
回显一个字符串并将其与另一个字符串进行比较并没有真正的帮助,sudo的退出代码足以进行测试。第一行可以是if sudo -n true 2>/dev/null; then
Steven K

@StevenKath它执行相同的操作,但是感谢您的建议。由于您的建议更加优雅,我改善了答案。
RaduRădeanu13年

2
我知道这是AskUbuntu,但这在MacOSX中不起作用,sudo -n始终返回0,因此检查返回代码失败。我在这里说这是因为我已经搜索了此页面,并且此页面出现在Google中。
Normadize 2015年

1
这是一个坏主意,因为如果mail_badpass在sudoers中启用了密码,它将在每次需要密码时将邮件发送到root 。
nyuszika7h
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.