![无需用户输入即可测试用户是否具有 sudo 权限](https://linux22.com/image/577121/%E6%97%A0%E9%9C%80%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%E5%8D%B3%E5%8F%AF%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7%E6%98%AF%E5%90%A6%E5%85%B7%E6%9C%89%20sudo%20%E6%9D%83%E9%99%90.png)
我有一个本地 shell 脚本,在传递有效负载之前,它会在远程主机上执行多项测试;其中一项测试是用户是否具有 sudo 权限,只需使用 即可检查,sudo -v
但这需要用户输入密码。此外,远程主机似乎有即时 sudo 超时,因此每次新连接都需要输入密码,而这是我无权更改的(作为一项政策)。
我当然可以测试用户是否属于某些组,但这与远程主机配置无关,所以我希望有一种方法可以检查,而不需要假设用户的组,也不需要用户输入?
谢谢!
更新:为了回应我的评论,我只想测试用户是否有可能使用 sudo,而不需要用户进行交互进行该测试。
答案1
恐怕你唯一能测试的是用户是否具有 sudo 权限没有密码。
执行
sudo -n true
如果 $? 为 0,则用户无需密码即可获得 sudo 访问权限;如果 $? 为 1,则用户需要密码。
如果你需要对特定程序进行验证,请更改true
你的程序,使程序不执行任何操作,例如chmod --help
答案2
如果您有一个具有 sudo 访问权限的用户(例如“root”),则可以使用它来检查其他登录信息。以具有访问权限的用户身份运行:
sudo -n -l -U foo 2>&1 | egrep -c -i “不允许运行 sudo|未知用户”
如果返回零,则“foo”具有访问权限。否则,它没有 sudo 访问权限。
答案3
我知道这是一个非常老的问题,但我发现-n
(非交互式) 标志和-v
/很有用-l
。但是,您必须检查输出:
$ sudo -vn && sudo -ln #User with cached credentials
User adminuser may run the following commands on computername:
(ALL) ALL
$ sudo -vn && sudo -ln #User who _can_ sudo but isn't cached
sudo: a password is required
$ sudo -vn && sudo -ln #User who can't at all
Sorry, user nonadmin may not run sudo on computername.
一些输出重定向和 grepping 可能会带你到达那里:
if (sudo -vn && sudo -ln) 2>&1 | grep -v 'may not' > /dev/null; then
#they're cool
exit 0 #Or, whatever
fi
答案4
sudo -l
这应该足以让您决定您是否拥有您想要/需要的特权。