Я недавно попал в беду из-за этого.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Есть ли способ проверить, есть ли у меня доступ к sudo или нет?
Я недавно попал в беду из-за этого.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
Есть ли способ проверить, есть ли у меня доступ к sudo или нет?
Ответы:
Беги 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
. Обратите внимание, что эта команда требует от вас ввести пароль.
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 или нет. 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
Кстати, мое решение:
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(с конца 2015 года mwhahaaa)
«Доступ к Судо» входит в ароматы. Два основных варианта: сначала вы или группа, членом которой вы являетесь, должна быть настроена для доступа 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.
Выполните следующие действия, чтобы просмотреть файл sudoers. Если ты там, у тебя есть sudo. Если нет, вы можете добавить себя.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
, так что он , вероятно, не системный администратор, ни даже один из элитных системных администраторов. Он, вероятно, просто пользователь, который думал, что ему могут быть предоставлены некоторые ограниченные полномочия. Что заставляет вас подозревать, что он может пойти ? su