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

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


是否可以检查我是否具有sudo访问权限?

评论

问问您的系统管理员?

@mdpc:除此之外还有其他方法吗?

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

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

#1 楼

运行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。请注意,此命令要求您输入密码。

评论


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

–布鲁斯
13年2月18日在20:00

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

–丹尼尔·贝克♦
13年2月18日在20:05

当我找回此信息时,您认为这意味着什么:patrick @ :〜$ sudo -v sudo:无法解析主机?我输入了密码,未获得关于未经授权的任何信息。我知道我从成功运行其他命令中得到了sudo,但是无法解析主机消息使我担心主机上的其他内容可能很时髦。

–帕特里克M
2014年4月21日,凌晨3:04

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

–艾尔
2014年12月17日23:10

在RHEL 6上对我不起作用,sudo -v给出了“ xx不在sudoers文件中。将报告此事件。”

–79E09796
16年9月1日在17:03

#2 楼

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

评论


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

– G-Man说“恢复莫妮卡”
2014年12月18日下午4:09

或最好解释一下发生的事情

–猎犬
2014-12-18 20:47

@Jonathan:如果您现在要在ubuntu rigt中编写脚本,那么sudo -l询问您是否可以使用sudo的密码。 sudo -v仅询问您是否可以,并且“ $(whoami)”!=“ root”绝不会在任何Linux中询问任何问题。

–bksunday
2015年8月3日,下午3:37

@bksunday你是正确的。我现在在干净的Debian Jessy上进行了测试,并确认了您的结果。我之前的评论(现在已删除)可能是在具有某些sudo priv的计算机上进行测试的结果。

–乔纳森·本·阿夫拉罕
15年8月3日,下午4:30

@ G-Man,但是这个简单的答案可能比丹尼尔的答案更精确,对我的帮助远不止于此,这条命令无疑是最后的结局...

–贝塔利斯塔
16年1月4日在14:48

#3 楼

这是脚本友好的版本:

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

评论


默认情况下不提供超时的任何替代方法,例如在OS X上?

–哈里
18年6月1日在16:27

您需要安装coreutils,例如brew安装coreutils。

– Kenorb
18年6月13日在15:08

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

–beruic
18-10-11在11:04



@beruic,您可以尝试执行此操作(在我的答案中解释)超时-s SIGKILL 5s sudo -v &&(回显SUDO访问权限;退出0)|| (回显SUDO访问被拒绝;出口1)

–om-ha
20-10-8在15:17

#4 楼

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
 


#5 楼

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

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


对我而言脚本编写成功。
如果当前用户可以调用'sudo',则此表达式给出0,否则返回1

解释:
-n的附加参数sudo防止交互。
命令'$A'的输出sudo -n -v 2>&1可能为:
-空(在这种情况下,当前用户可以调用sudo),或者:
-请注意当前用户无权使用sudo,或者:
-密码的问题文本(在这种情况下,该用户已被授权)。
(“ asswor”适用于英语“密码”和德语“ Passwort”)。

#6 楼

我的投票和评论等级较低,但我想提高Gerald Schade的回答,因为我发现以前是唯一的方法,并认为其他人都不知道-直到现在:D

btw我的解决方案:

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


(从2015年年底开始,mwhahaaa)

评论


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

–喝一些皮条客果汁IT
17-10-1在23:24

#7 楼

这应该足以告诉您是否具有root用户:

sudo whoami


如果sudo要求输入root密码,或者它不起作用,则也意味着您没有没有root特权(至少没有通过sudo)。

评论


OP必须在sudoers列表中才能起作用,这使问题无法解决。

– Burgi
20-2-11在9:59

@Burgi答案中未提及的部分是,如果sudo要求输入root密码,或者它不起作用,这还意味着您没有root特权(至少不是通过sudo)。我将其插入答案。

–peterh-恢复莫妮卡
20-2-11在11:04

#8 楼

“ Sudo访问”具有多种口味。有两种主要的味道:首先,需要在/ etc / sudoers文件中设置您或您所属的组的sudo访问权限。

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

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

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从中读取密码标准输入-p设置为空提示。 -K清除第二次访问。

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

#9 楼

            # Verify if current user is root.
            local current_username=$(whoami)
            [[ "$current_username" == 'root' ]] && echo true && return 0

            # Verify if sudo is installed.
            if [[ $(validate_apt 'sudo') == 'false' ]]; then
                echo false && return 0
            fi

            # Verify if the current user belongs to groups 'sudo' or 'root'.
            local current_user_groups=$(groups $current_username)
            if [[ $current_user_groups == *'root'* ]] ||
                   [[ $current_user_groups == *'sudo'* ]]; then
                echo true && return 0
            fi

            # Verify if file /etc/sudoers.d/username exists.
            if [[ -f /etc/sudoers.d/$current_username ]]; then
                echo true && return 0
            fi


#10 楼

我想检查sudo模式以获得良好的脚本交互性/错误检查。
我喜欢Kenorb的答案,该答案使用了超时,但由于默认的kill信号,它对我不起作用。因此,我对此位进行了编辑并添加了一些附加内容,如下所述。
 timeout -s SIGKILL 5s sudo -v && (echo SUDO Access Granted ; exit 0) || (echo SUDO Access Denied ; exit 1)
 

说明:


-s SIGKILLSIGKILL指定为终止信号。我更喜欢SIGSTOP,因为它在STDOUT中的杂波更少。查杀信号的完整列表可以在这里找到。也是SIGSTOP v.s. SIGKILL



信号SIGKILL和SIGSTOP不能被捕获,阻止或忽略。




5s表示5秒,秒是默认值,但您也可以使用m分钟或h小时。供参考:man timeout中的DURATION参数说明,出于所选答案中指定的原因


sudo -v



exit 0exit 1表示成功和失败退出状态码。退出状态代码的完整列表可在此处1,此处2和此处3


;用于链式内联外壳命令。

&&||是只是一些使用sudo -v退出代码的布尔表达式。如果您感到困惑,那只是布尔/逻辑短路评估



#11 楼

请按照以下步骤查看sudoers文件。如果您在那里,则拥有sudo。如果不是,则可以添加自己。


su
visudo
在文件底部,输入your_username_here ALL=(ALL) ALL

按ESC并键入:wq

键入exit

重新运行需要sudo的命令

输入密码(不是root用户的密码)


评论


OP在运行sudo时遇到了麻烦,因此他可能不是系统管理员,甚至不是精英系统管理员之一。他可能只是一个认为他可能被授予了某些有限权限的用户。是什么让您怀疑他可以去苏?

–斯科特
2014年8月20日在20:46

尊重这个答案的发布者,尽管不喜欢他,他还是保留了它,以便其他人可以从错误的假设以及我之上的评论中受益。

–om-ha
20-10-8在16:01