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

Bru*_*uce 126 linux sudo sudoers

因为这个,我最近遇到了麻烦。

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.
Run Code Online (Sandbox Code Playgroud)

有没有办法检查我是否有 sudo 访问权限?

Dan*_*eck 141

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

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].
Run Code Online (Sandbox Code Playgroud)

手册页摘录:

如果给定 -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].
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢。sudo -v 对我有用。手册页说我也可以运行 sudo -l 但这要求输入密码。这是为什么? (3认同)
  • @Bruce 我在这里猜测,否则有人(或您运行的程序)可以找出当前用户可以执行哪些程序(可能无需输入密码)并尝试恶意使用该信息。 (2认同)

小智 50

这很简单。运行sudo -l。这将列出您拥有的任何 sudo 权限。

  • @Jonathan:如果你现在在 ubuntu rigt 中编写脚本,`sudo -l` 会询问你是否可以 sudo 的密码。`sudo -v` 仅在你可以的情况下询问,并且 `"$(whoami)" != "root"` 在任何 linux 中都不会询问任何内容。 (2认同)
  • @G-Man,但是这个简单的答案对我的帮助可能比丹尼尔的答案更精确,不幸的是,这个命令是最后的结果...... (2认同)

小智 18

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
Run Code Online (Sandbox Code Playgroud)

是脚本中使用完整示例

#!/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
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 16

这是脚本友好的版本:

timeout 2 sudo id && echo Access granted || echo Access denied
Run Code Online (Sandbox Code Playgroud)

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

您还可以将其设置在一个变量中,例如:

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"
Run Code Online (Sandbox Code Playgroud)

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

  • 这在脚本中对我不起作用。由于无法解释的原因,脚本挂起,直到我杀死它。 (3认同)
  • 请不要这样做。 `sudo` 具有您需要的内置功能: `sudo -vn 2> /dev/null && echo 您可以在没有密码的情况下 sudo || echo 需要密码或不允许 sudo` (2认同)

Ger*_*ade 8

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

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

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

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