Нещодавно я потрапив у біду через це.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Чи є спосіб перевірити, чи є у мене доступ до судо чи ні?
Нещодавно я потрапив у біду через це.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Чи є спосіб перевірити, чи є у мене доступ до судо чи ні?
Відповіді:
Біжи 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
. Зауважте, що ця команда вимагає ввести свій пароль.
patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>
:? Я ввів свій пароль і нічого не отримав про несанкціонований доступ. Я знаю, що я маю sudo
успішно виконувати інші команди, але це unable to resolve host
повідомлення мене стосується того, що на хості може бути щось інше.
sudoers
файлом. Там ви можете вказати, на якому хості користувач має право виконувати певну команду (це корисно при використанні одного sudoers
файлу на кількох машинах). Можливо, ім'я хоста, вказане у цьому файлі, не вдалося вирішити. Спробуйте перевірити це, host
наприклад, командою.
sudo -v
дав "xx немає у файлі sudoers. Про цей інцидент буде повідомлено."
Це дуже просто. Біжи sudo -l
. Тут буде перераховано всі наявні у вас привілеї sudo.
sudo -l
запитує пароль, чи можете ви судо чи ні. sudo -v
запитує лише якщо ти можеш, і "$(whoami)" != "root"
ніколи нічого не запитає в будь-якому Linux.
sudo
приватні особи.
Ось зручна для сценарію версія:
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?
coreutils
, наприклад brew install coreutils
.
Відповідь Джеральда Шайда тут ще можна вдосконалити!
Використовуйте
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
Для мене ' 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").
У мене низький ранг, щоб проголосувати та прокоментувати, але я хотів підтвердити відповідь Джеральда Шейда, оскільки я виявив, що це єдиний шлях раніше, і подумав, що це знає ніхто інший - дотепер: D
btw моє рішення:
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(з кінця 2015 року mwhahaaa)
"Судо-доступ" входить в аромати. Два основні смаки: спочатку вам або групі вашого члена потрібно налаштувати доступ до 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.
Виконайте ці дії, щоб переглянути файл судорів. Якщо ви там, у вас є судо. Якщо ні, ви можете додати себе.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
, тому він, ймовірно, не є системним адміністратором, навіть навіть одним з елітних системних адміністраторів. Ймовірно, він просто користувач, який думав, що йому можуть бути надані деякі обмежені повноваження. Що змушує вас підозрювати, що він може піти su
?