У меня есть программа, которая должна вести себя по-другому, если она запускается под "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 :-)
Ответы:
Да, есть 4 переменные окружения, установленные при запуске программы под sudo:
Обратите внимание, что их можно подделать, просто установив их. Не доверяй им ни за что критическое.
Например: в этой программе нам нужно указать пользователю запустить другую программу. Если текущий был запущен с sudo, другой будет тоже.
Обратите внимание, что он проверяет только переменную SUDO_ *, если может сначала доказать, что она работает от имени пользователя root. Даже тогда это только использует это, чтобы изменить некоторый полезный текст.
источник
Это не дает прямого ответа на вопрос, но я не думаю, что здесь задают правильный вопрос. Мне кажется, что спрашивающий хочет, чтобы программа работала иначе, предположительно, если у нее есть определенные разрешения или нет, однако я бы сказал, что проверка sudo - это не способ сделать это. Во-первых, многие системы могут не реализовывать «sudo», это ни в коем случае не требуется в Linux или многих Unixes.
Например, пользователь уже может войти в систему как пользователь root, что делает sudo бессмысленным, или, возможно, в системе есть пользователи без полномочий root, у которых все еще есть возможности для выполнения административных задач, которые программа может пожелать выполнить. Наконец, возможно, система вообще не имеет рута или sudo и вместо этого использует систему обязательного контроля доступа с различными возможностями и не может поймать всех суперпользователей, в которых может быть sudo. Или пользователь может быть заблокирован, но в учетную запись, которая имеет -less-разрешения, чем их собственная учетная запись по соображениям безопасности (я часто запускаю ненадежный код с временным непривилегированным пользователем, который может писать только на ramdisks, чтобы удалить, а не поднять мои разрешения ). В целом плохая идея предполагать наличие конкретной модели разрешений, такой как sudo или существование root, или предполагать, что sudoed-пользователь имеет какие-то особые привилегии.
Если вы хотите выяснить, есть ли у вас разрешения на выполнение операции, лучше всего просто попытаться сделать это, а затем проверить errno на наличие проблем с разрешениями, если она завершится неудачно или если это многоэтапная операция, которая должна либо завершиться неудачей, либо завершиться успешно. вы можете проверить, будет ли операция работать с такими функциями, как функция доступа POSIX (остерегайтесь возможных условий гонки здесь, если разрешения активно изменяются)
Если, кроме того, вам необходимо знать реального пользователя, стоящего за sudo, вы можете использовать функцию getlogin, которая должна работать для любого интерактивного сеанса с нижележащим терминалом и позволит вам, например, найти, кто «в действительности» выполняет команду для аудита, или найти Домашний каталог реального пользователя для сохранения логов.
Наконец, если вам действительно нужно выяснить, есть ли у пользователя root-доступ (все еще плохая идея, но менее специфична для реализации), вы можете использовать getuid для проверки uid 0 и, следовательно, root.
источник
Есть два механизма, которые можно использовать.
growisofs
не любит работать под SUDO, поэтому я отменяю переменные SUDO в сценариях, где я его использую. Это может быть подделано другим способом. (Переменная SUDO также переносится в среду для сценариев, запускаемых с помощью команд at и batch.)Чаще всего проверяют, работаете ли вы от имени соответствующего пользователя. Команда
id
может быть использована для этого. Сценарий TomOnTime используетid
команду, чтобы определить,sudo
может ли потребоваться выполнить следующую команду.источник
sudo
бинарный файл во что-то другое? Или назвать какой-нибудь другой исполняемый файл,sudo
чтобы имитировать противоположное? Не то чтобы я действительно ожидал, что кто-нибудь вменяемый сделает это ...root
доступ для переименованияsudo
исполняемого файла. Обычный пользователь не сможет этого сделать. Я заметил, что вы можете подделать, что вы работаете подsudo
. Переименование существующей программы будет работать. Код, необходимый для специальной фальшивойsudo
программы, тривиален.Вы можете сравнить эффективный и реальный идентификатор пользователя.
Это не обязательно означает, что он выполняет отмену sudo (также может быть установлено setuid'd), но указывает на то, что программа имеет больше прав, чем может ожидать пользователь. (например, в программе, которая обычно выполняется без таких прав, но должна запускаться с ними во время установки или для установки обновлений. Затем вы можете использовать это, чтобы дать несколько предупреждений об этом).
источник
sudo
устанавливает как эффективный, так и реальный идентификатор. В отличие от suid, чего нет. Вот тривиальная программа на C, которую вы можете использовать для тестирования (извините, комментарий удалит новые строки, вам придется добавить их обратно):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
perl -E 'say $<, "\n", $>'
Вы можете проверить эффективную переменную UID (EUID) следующим образом:
источник
sudo echo $USER
печатает непривилегированное имя пользователя (переменная подставляется ДО sudo). Я фактически закончил тем, что использовал ваш код в моем сценарии. Спасибо!Вы можете коснуться файла,
/root
а затемif -e
его. И если -e верноrm
(проверяя код ошибки), то ваш тест будет работать в следующий раз.Проверка кода ошибки (или кода возврата) после rm не позволяет кому-либо вручную использовать полномочия sudo для создания файла, чтобы разыграть вас.
источник
/root
(что не обязательно совпадает с выполнением с UID 0), но не проверяет, получил ли он эти разрешения, используяsudo
.Я обнаружил, что это хорошо работает для этого
источник