Як перевірити, чи є у мене доступ до судо?


104

Нещодавно я потрапив у біду через це.

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

Чи є спосіб перевірити, чи є у мене доступ до судо чи ні?


Запитайте свого системного адміністратора?
mdpc

1
@mdpc: Чи є ще один спосіб, крім цього?
Брюс

Ви не згадали, чи можете ви отримати доступ до кореневих програм чи ні.
mdpc

Відповіді:


121

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

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

Уривок чоловічої сторінки:

Якщо надано параметр -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].

Щоб дізнатися, що вам дозволяється запускати з різними привілеями, ви можете використовувати sudo -l. Зауважте, що ця команда вимагає ввести свій пароль.


2
Дякую. sudo -v працює для мене. Сторінка man каже, що я також можу запустити sudo -l, але просить ввести пароль. Чому так?
Брюс

2
@Bruce я здогадуюсь тут, але в іншому випадку хтось (або програма, яку ви запускаєте) може дізнатися, які програми можуть виконувати (можливо, не вводячи пароль) вашим поточним користувачем, і спробувати використовувати цю інформацію зловмисно.
Даніель Бек

Що ви гадаєте, що це означає, коли я повертаю це patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>:? Я ввів свій пароль і нічого не отримав про несанкціонований доступ. Я знаю, що я маю sudoуспішно виконувати інші команди, але це unable to resolve hostповідомлення мене стосується того, що на хості може бути щось інше.
Патрік М

@PatrickM Це схоже на проблему з sudoersфайлом. Там ви можете вказати, на якому хості користувач має право виконувати певну команду (це корисно при використанні одного sudoersфайлу на кількох машинах). Можливо, ім'я хоста, вказане у цьому файлі, не вдалося вирішити. Спробуйте перевірити це, hostнаприклад, командою.
Але

Не працює для мене на RHEL 6, sudo -vдав "xx немає у файлі sudoers. Про цей інцидент буде повідомлено."
79E09796

43

Це дуже просто. Біжи sudo -l. Тут буде перераховано всі наявні у вас привілеї sudo.


1
Можливо, заперечує, бо це повторює те, що Деніел Бек сказав майже два роки тому.
G-Man

1
Або пояснює, що трапляється, це коментар, у кращому випадку
Рамхаунд

2
@Jonathan: якщо ви сценарій u ribut ubuntu зараз, sudo -lзапитує пароль, чи можете ви судо чи ні. sudo -vзапитує лише якщо ти можеш, і "$(whoami)" != "root"ніколи нічого не запитає в будь-якому Linux.
bksunday

@bksunday Ви маєте рацію. Я зараз перевірив чисту Debian Jessy і підтвердив ваші результати. Мій попередній (видалений зараз) коментар був, ймовірно, результатом тестування на машині, на якій у мене були деякі sudoприватні особи.
Джонатан Бен-Аврахам

@ G-Man, але ця проста відповідь допомогла мені більш ніж напевно точнішою відповіддю Даніеля, де ця команда на самому кінці невдало ...
Betlista

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.


Будь-які альтернативи там, де timeoutза замовчуванням немає, наприклад, на OS X?
Гаррі

1
Вам потрібно встановити coreutils, наприклад brew install coreutils.
kenorb

2
Це не працює для мене в сценарії. З незрозумілої причини сценарій висить, поки я не вб'ю його.
beruic

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

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

btw моє рішення:

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

(з кінця 2015 року mwhahaaa)


1
Прочитайте "Чому мені потрібно коментувати 50 репутацій", щоб зрозуміти, як можна починати коментувати.
Pimp Juice IT

1

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

По-друге, вам потрібно знати свій пароль, або вам потрібно було виконати команду 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

-S повідомляє sudo, щоб прочитати пароль від stdin. -P задає порожній запит. -K видаляє другий раз доступ.

Оскільки він надсилає stderr в / dev / null, він також перевірить, чи є у користувача перший тип доступу до sudo.


-4

Виконайте ці дії, щоб переглянути файл судорів. Якщо ви там, у вас є судо. Якщо ні, ви можете додати себе.

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

11
ОП "потрапив у неприємності" для запуску sudo, тому він, ймовірно, не є системним адміністратором, навіть навіть одним з елітних системних адміністраторів. Ймовірно, він просто користувач, який думав, що йому можуть бути надані деякі обмежені повноваження. Що змушує вас підозрювати, що він може піти su?
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.