У меня есть программа, которая должна вести себя по-другому, если она выполняется под «sudo». Есть ли способ узнать, был ли он запущен под sudo?
Обновить: Кто-то спросил, зачем мне это делать. В этом случае на Mac, использующем MacPorts, выводится сообщение о необходимости вырезать и вставить определенную команду. Если команда MacPorts была запущена с sudo, она должна включать sudo в пример команды:
$ sudo port selfupdate
---> Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
---> Updating the ports tree
---> MacPorts base is already the latest version
The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated
^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead. It would be even better if it just did it for you :-)
Да, при запуске программы под sudo устанавливаются 4 переменные среды:
$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20
Обратите внимание, что их можно подделать, просто установив их. Не доверяйте им ни в чем критическом.
Например: в этой программе нам нужно сказать пользователю запустить какую-то другую программу. Если текущий был запущен с sudo, другой тоже.
#!/bin/bash
echo 'Thank you for running me.'
if [[ $(id -u) == 0 ]]; then
if [[ -z "$SUDO_COMMAND" ]]; then
echo 'Please now run: next_command'
else
echo 'Please now run: sudo next_command'
fi
else echo 'Error: Sadly you need to run me as root.'
exit 1
fi
Обратите внимание, что он проверяет переменную SUDO_ * только в том случае, если может сначала доказать, что она работает от имени пользователя root. Даже тогда он использует его только для изменения некоторого полезного текста.
Это не дает прямого ответа на вопрос, но я не думаю, что здесь задается правильный вопрос. Мне кажется, что спрашивающий хочет программу, которая будет действовать по-другому, предположительно, если у нее есть определенные разрешения или нет, однако я бы сказал, что проверка sudo - не способ сделать это. Во-первых, многие системы могут не реализовывать «sudo», это ни в коем случае не требуется в Linux или многих Unix.
Например, пользователь может уже войти в систему как root, что делает sudo бессмысленным, или, возможно, в системе есть пользователи, отличные от root, у которых все еще есть возможности для выполнения административной задачи, которую программа может захотеть выполнить. Наконец, возможно, в системе вообще нет root или sudo, а вместо этого используется система обязательного контроля доступа с различными возможностями и не может перехватить всех суперпользователей для sudo. Или пользователь может быть sudoed, но в учетную запись, которая имеет -less- разрешения, чем его собственная учетная запись по соображениям безопасности (я часто запускаю ненадежный код с временным непривилегированным пользователем, который может писать только на ramdisks, чтобы удалить, а не повысить мои разрешения ). В целом плохая идея предполагать определенную модель разрешений, такую как sudo или существование root, или предполагать, что пользователь sudoed имеет какие-либо определенные привилегии.
Если вы хотите узнать, есть ли у вас разрешения на выполнение операции, лучший способ обычно - просто попробовать и сделать это, а затем проверить errno на наличие проблем с разрешениями, если она не удалась или если это многоступенчатая операция, которая должна либо полностью завершиться неудачно, либо все удастся. вы можете проверить, будет ли операция работать с такими функциями, как POSIX доступ функция (остерегайтесь возможных условий гонки здесь, если разрешения активно меняются)
Если вам нужно знать настоящего пользователя sudo, вы можете использовать Getlogin функция, которая должна работать для любого интерактивного сеанса с базовым терминалом и позволит вам, например, узнать, кто «на самом деле» выполняет команду для аудита, или найти домашний каталог реального пользователя для сохранения журналов.
Наконец, если вы действительно хотите узнать, есть ли у пользователя root-доступ (все еще плохая идея, но менее специфичная для реализации), вы можете использовать Getuid чтобы проверить uid равный 0 и, следовательно, root.
Можно использовать два механизма.
growisofs
не любит работать под SUDO, поэтому я отключил переменные SUDO в скриптах, где я его использую. Его можно подделать и другим способом. (Переменная SUDO также переносится в среду для сценариев, выполняемых с помощью команд at и batch.)Чаще всего проверяют, работаете ли вы как соответствующий пользователь. В id
для этого можно использовать команду. Сценарий TomOnTime использует id
команда, чтобы определить, если sudo
может потребоваться выполнить следующую команду.
Вы можете сравнить эффективный идентификатор пользователя с реальным.
Строго говоря, это не означает, что выполняется команда undo sudo (также можно установить uid'd), но указывает на то, что программа имеет больше прав, чем может ожидать пользователь. (например, в программе, которая обычно выполняется без таких прав, но должна запускаться с ними во время установки или для установки обновлений. Затем вы можете использовать это, чтобы дать некоторый предупреждающий отзыв об этом).
Вы можете проверить действующую переменную UID (EUID) следующим образом:
if [[ $EUID -eq 0 ]]; then
echo "running as root"
else
echo "not running as root"
fi
Вы можете коснуться файла в /root
а потом if -e
Это. И если -e верно, rm
(проверяя код ошибки), чтобы ваш тест работал в следующий раз.
Проверка кода ошибки (или кода возврата) после rm не позволяет кому-либо легко использовать sudo powers для создания файла, чтобы подшутить над вами.
Я обнаружил, что это хорошо подходит для этого
[ $(cat /proc/$PPID/loginuid) -ne 0 ] && [ "$USER" == "root" ]