如何检查我是否具有sudo访问权限?


104

因此,我最近遇到了麻烦。

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

有没有一种方法可以检查我是否具有sudo访问权限?


询问系统管理员?
mdpc

1
@mdpc:除此之外还有其他方法吗?
布鲁斯

您没有提到是否可以获得root用户访问权限。
mdpc

45
这必须是看到有人跟进“此事件将被举报”的第一个实例。
slhck

Answers:


121

运行sudo -v。通常用于延长sudo密码超时,但可用于确定您是否具有任何sudo特权。

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

手册页摘录:

如果给定-v(验证)选项,则sudo将更新用户的时间戳,并在必要时提示用户输入密码。这会将sudo超时再延长5分钟(或sudoers中设置的任何超时时间),但不会运行命令。

如果您只允许用户运行特定的命令,该命令将工作,说明你被允许运行的东西有不同的权限。尽管在尝试执行命令时消息看起来有所不同(在这种情况下,您是不允许的(并且没有邮件发送到root)),但是如果管理员阅读,仍然有可能会遇到麻烦/var/log/secure

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

要了解什么你被允许具有不同权限的运行,你可以使用sudo -l。请注意,此命令要求您输入密码。


2
谢谢。sudo -v对我有用。手册页说我也可以运行sudo -l,但是要求输入密码。这是为什么?
2013年

2
@Bruce我在这里猜测,否则其他人(或您运行的程序)可能会发现当前用户可以执行哪些程序(可能无需输入密码),并尝试恶意使用该信息。
丹尼尔·贝克

当我找回此字时,您认为这意味着什么patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>?我输入了密码,未获得关于未经授权的任何信息。我知道我已经sudo成功运行了其他命令,但是该unable to resolve host消息使我担心主机上可能还有其他时髦问题。
Patrick M

@PatrickM sudoers文件似乎有问题。您可以在其中指定授权用户在哪台主机上运行特定命令(sudoers在多台计算机上使用相同文件时,这很有用)。可能无法解析该文件中指定的主机名。例如,尝试使用host命令检查它。
Ale 2014年

在“ RHEL 6 sudo -v” 上对我不起作用,因为“ xx不在sudoers文件中。将报告此事件。”
79E09796'9

43

这很简单。运行sudo -l。这将列出您拥有的所有sudo特权。


1
也许不满意,因为它重复了丹尼尔·贝克(Daniel Beck)近两年前所说的话。
G-Man

1
或解释发生的事情,充其量
只是

2
@Jonathan:如果您现在要在ubuntu rigt中编写脚本,sudo -l请询问您是否可以sudo的密码。sudo -v仅询问您是否可以,并且"$(whoami)" != "root"永远不会在任何Linux中询问任何问题。
bksunday 2015年

@bksunday你是正确的。我现在在干净的Debian Jessy上进行了测试,并确认了您的结果。我之前的评论(现在已删除)可能是在我拥有一些sudo特权的计算机上进行测试的结果。
乔纳森·本·阿夫拉罕

@ G-Man,但是这个简单的答案
比丹尼尔

11

这是脚本友好的版本:

timeout 2 sudo id && echo Access granted || echo Access denied

因为如果您没有sudo访问权限,它将不会停留在密码输入上。

您也可以在类似以下的变量中进行设置:

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"

注意:在macOS上,您需要安装coreutils,例如brew install coreutils


timeout默认情况下(例如,在OS X上),哪里没有其他替代品?
哈里

1
您需要安装coreutils,例如brew install coreutils
kenorb

2
在脚本中,这对我不起作用。由于无法解释的原因,脚本挂起,直到我将其杀死为止。
beruic

6

Gerald Schade 在这里的答案,仍然可以改善!

采用

prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of sudo-command is 0
  echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
  echo "has_sudo__needs_pass"
else
  echo "no_sudo"
fi

是脚本用法完整示例

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_sudo__pass_set"
    elif echo $prompt | grep -q '^sudo:'; then
    echo "has_sudo__needs_pass"
    else
    echo "no_sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_SUDO=$(has_sudo)

    case "$HAS_SUDO" in
    has_sudo__pass_set)
        sudo $cmd
        ;;
    has_sudo__needs_pass)
        echo "Please supply sudo password for the following command: sudo $cmd"
        sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser

2

对我而言,“ sudo -v”和“ sudo -l”在脚本中不起作用,因为有时是交互的(如上所述,向我询问密码)。“ sudo -n -l”也没有起作用,尽管我有sudo权限,但由于缺少密码,它给出了退出代码“ 1”。但是将命令扩展到:

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

对我来说,脚本是成功的。该表达式给出0当前用户是否可以调用“ sudo”,1否则不能调用。

说明:
附加的参数-n,以sudo防止交互性。命令' '
的输出可能是: -空(在这种情况下,当前用户可以调用sudo),或者: -注意当前用户无权使用sudo,或者: -提示文本。密码(在这种情况下,已授权用户)。 (“ asswor”将适用于英语“ password”以及德语“ passwort”)。$Asudo -n -v 2>&1




2

我的投票和评论水平较低,但我想赞成Gerald Schade的回答,因为我发现以前是唯一的方法,并认为没有其他人知道-直到现在:D

顺便说一句我的解决方案:

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(从2015年底开始)


1
阅读“为什么我需要50个信誉才能发表评论”,以确保您了解如何开始发表评论。
Pimp Juice IT

1

“ Sudo访问”具有多种口味。有两种主要的风格:首先,需要在/ etc / sudoers文件中设置您或您的成员组以进行sudo访问。

其次,您需要知道密码,或者您最近需要执行sudo命令。最近的时间足以使超时没有过期。(有趣的事实:您可以在sudoer的文件中花费很长的时间。)

我经常想在脚本的序言中测试第二种访问方式,这将需要一些步骤。如果此检查失败,我可以建议用户他需要在运行脚本之前启用第二种访问方式。

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

-S告诉sudo从stdin读取密码。-p设置为空提示。-K清除第二次访问。

由于它将stderr发送到/ dev / null,因此还将检查用户是否具有第一类sudo访问权限。


-4

请按照以下步骤查看sudoers文件。如果您在那儿,您将拥有sudo。如果没有,您可以添加自己。

  1. su
  2. visudo
  3. 在文件底部输入 your_username_here ALL=(ALL) ALL
  4. 点击ESC并输入:wq
  5. 类型 exit
  6. 重新运行所需的命令 sudo
  7. 输入密码(不是root用户的密码)

11
该任择议定书“陷入困境”来运行sudo,所以他可能不是系统管理员,也不是精英的系统管理员甚至一个。他可能只是一个以为他可能会被授予某些有限权限的用户。是什么让您怀疑他会去su
斯科特
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.