90

Я недавно попал в беду из-за этого.

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

Есть ли способ проверить, есть ли у меня доступ к sudo или нет?

8 ответов8

113

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

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

Выдержка из справочной страницы:

Если задана опция -v (validate), 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 . Обратите внимание, что эта команда требует от вас ввести пароль.

41

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

8

Вот версия для сценария:

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 .

2

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

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

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
1

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

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

Я часто хочу проверить второй тип доступа в прологе скрипта, который должен выполнить некоторые шаги. Если эта проверка не удалась, я могу сообщить пользователю, что ему нужно разрешить 2-й вид доступа перед запуском скрипта.

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.

1

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

кстати мое решение:

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

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

1

Для меня ' 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" подойдет как для английского "пароля", так и для немецкого "Passwort").

-3

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .