2

В моем .zshrc у меня есть команды, которые запускают экземпляры различных программ, таких как Mozilla Firefox и Evolution. Я, очевидно, не хочу запускать их как root, поэтому я хочу проверить, являюсь ли я пользователем root, прежде чем запускать их. Как мне это сделать?

1 ответ1

2

Вы можете использовать, например, такой условный оператор:

PRGCMD="firefox"
PRGUSR="user"
if [[ $UID == 0 || $EUID == 0 ]]; then
   # root
   echo Running programm as User $PRGUSR
   sudo -u $PRGUSR ${(z)PRGCMD}
else
   ${(z)PRGCMD}
fi

Сначала проверяется, является ли реальный идентификатор пользователя или эффективный идентификатор пользователя zero , то есть root .

Если это так, он использует sudo для запуска программы, определенной в переменной PRGCMD как пользователь, определенный в переменной PRGUSR . (Вы можете пропустить эту строку, если хотите только предупреждающее сообщение.)

${(z)PRGCMD} разделяет слова так, как если бы в командной строке zsh PRGCMD содержал пробелы, то есть параметры программы.

Короткий вариант, который запускает программу только без полномочий root: [[ $UID != 0 || $EUID != 0 ]] && firefox


Кроме того, вы, возможно, захотите включить %# в ваше приглашение, чтобы увидеть, что ваша текущая оболочка имеет привилегию. От man zshmisc:

%#     A `#' if the shell is running with privileges, a `%' if not.  Equivalent to `%(!.#.%%)'.  The definition of `privileged', for  these
       purposes,  is that either the effective user ID is zero, or, if POSIX.1e capabilities are supported, that at least one capability is
       raised in either the Effective or Inheritable capability vectors.

Код, определяющий, работает ли оболочка с привилегиями (определенными в privasserted() в utils.c), не может быть выполнен в коде оболочки IMHO, поэтому, если вы хотите точно такое же поведение, вероятно, лучше всего проанализировать вывод %# быстрое расширение:

[[ $(print -P "%#") == '#' ]] && echo shell privileged || echo shell not privileged

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .