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

104

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

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

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

Брюс
источник
Спросите своего системного администратора?
mdpc
1
@mdpc: Есть ли другой способ, кроме этого?
Брюс
Вы не упомянули, можете ли вы получить root-доступ или нет.
mdpc
46
Это должен быть первый случай, когда кто-то следит за сообщением об этом инциденте .
Slhck

Ответы:

121

Беги 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. Обратите внимание, что эта команда требует от вас ввести пароль.

Даниэль Бек
источник
2
Благодарю. У меня работает sudo -v. На странице руководства написано, что я тоже могу запустить sudo -l, но запрашивается пароль. Почему это?
Брюс
2
@ Брюс Я предполагаю здесь, но в противном случае кто-то (или программа, которую вы запускаете) мог бы выяснить, какие программы могут выполняться (возможно, без ввода пароля) вашим текущим пользователем, и попытаться использовать эту информацию злонамеренно.
Даниэль Бек
Как вы думаете, что это значит, когда я получу это обратно patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>? Я ввел свой пароль и ничего не узнал о несанкционированных. Я знаю, что sudoуспешно выполнил другие команды, но это unable to resolve hostсообщение заставило меня задуматься о том, что на хосте может быть что-то еще.
Патрик М
@PatrickM Похоже, проблема с sudoersфайлом. Здесь вы можете указать, на каком хосте пользователь авторизован для выполнения определенной команды (это полезно при использовании одного и того же sudoersфайла на нескольких машинах). Возможно, имя хоста, указанное в этом файле, не может быть разрешено. Попробуйте проверить это с помощью hostкоманды, например.
Ale
У меня не работает на RHEL 6, он сказал: sudo -v«xx отсутствует в файле sudoers. Об этом инциденте будет сообщено».
79E09796
43

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

Брэд Даусс
источник
1
Может быть, голосование опущено, потому что оно повторяет то, что сказал Дэниел Бек два года назад.
G-Man
1
Или объясняет, что происходит, это в лучшем случае комментарий
Ramhound
2
@Jonathan: если вы сейчас будете писать сценарии в Ubuntu Rigt, sudo -lпопросите пароль, если вы можете sudo или нет. sudo -vспрашивает только, если вы можете, и "$(whoami)" != "root"никогда не будет спрашивать ничего в любом Linux.
bksunday
@bksunday Вы правы. Я тестировал сейчас на чистом Debian Jessy и подтвердил ваши результаты. Мой предыдущий (удаленный сейчас) комментарий, вероятно, был результатом тестирования на машине, на которой у меня были некоторые sudoпривилегии.
Джонатан Бен-Авраам
@ G-Man, но этот простой ответ помог мне более, чем, вероятно, более точный ответ Дэниела, где, к сожалению, эта команда - самый конец ...
Бетлиста
11

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

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.

kenorb
источник
Любые альтернативы для где timeoutне доступны по умолчанию, например, на OS X?
Гарри
1
Вам необходимо установить coreutils, например brew install coreutils.
Кенорб
2
Это не работает для меня в сценарии. По необъяснимой причине скрипт зависает, пока я его не убью.
Беруик
7

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

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

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
ajneu
источник
2

Для меня ' 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»).

Джеральд Шейд
источник
2

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

Кстати, мое решение:

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

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

user629901
источник
1
Прочтите «Почему мне нужно 50 репутации, чтобы комментировать», чтобы понять, как вы можете начать комментировать.
Сок Pimp IT
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.

Бен Хайд
источник
-4

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

  1. su
  2. visudo
  3. Внизу файла введите your_username_here ALL=(ALL) ALL
  4. Нажмите ESCи введите:wq
  5. Тип exit
  6. Повторите команду, которая нужна sudo
  7. Введите свой пароль (не пароль root)
Kruug
источник
11
ОП «попал в беду» для запуска sudo, так что он , вероятно, не системный администратор, ни даже один из элитных системных администраторов. Он, вероятно, просто пользователь, который думал, что ему могут быть предоставлены некоторые ограниченные полномочия. Что заставляет вас подозревать, что он может пойти ? su
Скотт