2013-02-18 19:36:35 +0000 2013-02-18 19:36:35 +0000
108
108

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

我最近因为这个问题遇到了麻烦

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

有什么方法可以检查我是否有sudo访问权限吗?

答案 (9)

123
123
123
2013-02-18 19:51:06 +0000

运行sudo -v。它通常用来延长sudo密码超时时间,但也可以用来确定你是否有任何sudo权限。

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

人页摘录:

如果给定了-v(validate)选项,sudo会更新用户的时间戳,必要时提示用户的密码。这将延长 sudo 超时 5 分钟(或在 sudoers 中设置的超时时间),但不会运行命令。虽然在这种情况下,当你试图执行一个你不被允许执行的命令时,消息看起来是不一样的(而且不会向root用户发送邮件),但如果管理员阅读了/var/log/secure,你仍然有可能会遇到麻烦。注意,这个命令需要你输入密码。

43
43
43
2014-12-17 22:55:06 +0000

这是非常简单的。运行sudo -l。这将列出你所拥有的任何sudo权限。

12
12
12
2016-06-14 00:49:56 +0000

这里是脚本友好版:

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

9
9
9
2017-12-30 18:57:38 +0000

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
3
3
3
2017-02-28 02:27:06 +0000

对我来说,’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‘的输出$A可能是: –空(在这种情况下,当前用户可以调用sudo),或者: –说明当前用户未被授权调用sudo,或者: –密码的问题文本(在这种情况下,用户被授权)。

2
2
2
2017-10-01 22:31:29 +0000

I’ve got low rank to vote and comment, but I wanted to upvote Gerald Schade’s answer, as I’ve found that the only way previously, and thought that no1 else knows it - till now :D

btw my solution:

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

(from the end of 2015 mwhahaaa)

1
1
1
2020-02-11 09:15:13 +0000

这应该足以告诉你是否有root权限:

sudo whoami

如果sudo询问root密码,或者不成功,也说明你没有root权限(至少通过sudo没有)。

1
1
1
2016-08-30 17:58:05 +0000

“须弥座通道 "有多种口味。有两种主要的方式,首先你需要在/etc/sudoers文件中设置sudo访问。首先,你或你的组成员需要在/etc/sudoers文件中设置了sudo访问权限。最近足够的时间,即超时未过。(有趣的是:你可以在你的sudoer文件中把超时时间设置得很长。)

我经常想在一个需要sudo一些步骤的脚本的prolog中测试第二种访问方式。

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

&001

-S告诉sudo从stdin中读取密码。-p设置一个空提示符。

因为它把 stderr 发送到 /dev/null,所以它也会检查用户是否有第一种类型的 sudo 访问。

-5
-5
-5
2013-02-18 19:41:36 +0000

按照这些步骤来查看sudoers文件。如果你在里面,你有sudo。如果没有,你可以自己添加。在文件的底部,输入su 4.按ESC键,输入visudo 5.输入your_username_here ALL=(ALL) ALL 6.输入:wq 重新运行需要exit 的命令 7.输入密码(不是root密码)。