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

Run sudo -v. Обычно она используется для продления таймаута вашего sudo пароля, но может быть использована для определения того, есть ли у вас какие-либо привилегии sudo.

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

Выдержка страницы Man:

Если задан параметр -v (validate), sudo обновит метку времени пользователя, запрашивая пароль пользователя, если это необходимо. Это продлевает таймаут sudo еще на 5 минут (или любой другой таймаут, установленный в sudoers), но команда не выполняется.

Если вашему пользователю разрешено выполнять только команды spec, эта команда будет работать, указывая, что вам разрешено выполнять something с различными привилегиями. Хотя сообщение выглядит по-другому при попытке выполнить команду, которая в данном случае запрещена (и no mail is sent to root ), все же возможно, что у вас возникнут проблемы, если администраторы прочитают /var/log/secure.

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

Чтобы узнать what you’re allowed to run with different privileges, вы можете использовать sudo -l. Обратите внимание, что эта команда требует ввода пароля.

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

Это очень просто. Run sudo -l. Здесь будут перечислены все привилегии, которые у вас есть.

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

Ответ Джеральда Шейда здесь , все еще может быть улучшен!

Использование

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 также не работал, он дал код выхода ‘1’, хотя у меня есть sudo разрешений, из-за отсутствия пароля. Но расширение команды до:

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

было успешным для меня для сценария. Это выражение дает 0, если текущий пользователь может вызвать ‘sudo’ и 1, если нет.

Пояснение: Дополнительный параметр -n в sudo предотвращает интерактивность.
Вывод $A команды ‘sudo -n -v 2>&1’ может быть: - пустым (в этом случае sudo может быть вызвано текущим пользователем), или: - примечание, что текущий пользователь не авторизован для sudo, или: - текст вопроса для пароля (в этом случае, пользователь авторизован). (“asswor” подойдет как для английского “password”, так и для немецкого “Passwort”).

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

У меня низкий рейтинг, чтобы проголосовать и прокомментировать, но я хотел увеличить голос Джеральда Шейда, так как я нашел, что единственный способ раньше, и думал, что No1 знает об этом - до сих пор :D

btw мое решение:

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

(с конца 2015 года mwhahaaaa)

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

“Доступ в Судо” приходит со вкусом. Два основных вкуса: Во-первых, вы или группа, в которую вы входите, должны быть настроены для доступа к sudo в файле /etc/sudoers.

Во-вторых, вы должны знать свой пароль, или вы должны были сделать команду sudo недавно. В последнее время достаточно, чтобы таймаут не истек. (Забавный факт: вы можете сделать тайм-аут очень долго в вашем sudoer’s файл.)

Я часто хочу, чтобы проверить для второго вида доступа в прологе скрипта, который будет нуждаться в 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

The -S говорит sudo читать пароль от stdin. В -p устанавливается пустая подсказка. -K очищает второй тип доступа.

Так как она посылает stderr в /dev/null, она также будет проверять, есть ли у пользователя первый тип доступа к sudo.

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

Выполните эти шаги для просмотра файла sudoers. Если вы там, у вас есть садо. Если нет, вы можете добавить себя.

  1. su
  2. visudo
  3. В нижней части файла введите your_username_here ALL=(ALL) ALL
  4. Нажмите ESC и введите :wq
  5. Введите exit
  6. Перезапустите вашу команду, которая нужна sudo
  7. Введите ваш пароль (не пароль root).

Похожие вопросы

6
10
5
37
7