Sie können zB eine solche bedingte Anweisung verwenden:
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
Es prüft zunächst, ob die reale Benutzer - ID oder die effektive Benutzer - ID ist zero
, dh root
.
In diesem Fall sudo
wird das Programm ausgeführt, das in der Variablen PRGCMD
als der in der Variablen definierte Benutzer definiert ist PRGUSR
. (Sie können diese Zeile weglassen, wenn Sie nur die Warnmeldung möchten.)
${(z)PRGCMD}
aufspaltet Worte , als ob zsh Befehlszeile im Fall PRGCMD
Leerzeichen enthält, dh Parameter an das Programm.
Eine kurze Variante, die das Programm nur als Nicht-Root ausführt, ist: [[ $UID != 0 || $EUID != 0 ]] && firefox
Zusätzlich möchten Sie möglicherweise %#
in Ihre Eingabeaufforderung aufnehmen, damit Sie sehen können, dass Ihre aktuelle Shell privilegiert ist. Von 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.
Der Code zu beurteilen , ob die Schale mit Privilegien ausgeführt wird (in definiert privasserted()
in utils.c
) kann IMHO nicht in Shell - Code ausgeführt werden, wenn Sie also genau das gleiche Verhalten wollen , es ist wahrscheinlich das beste die Ausgabe der analysieren %#
prompt Expansion:
[[ $(print -P "%#") == '#' ]] && echo shell privileged || echo shell not privileged
%#
sofortigen Erweiterung zu adressieren .print -P "%#"
dein Problem gelöst hat. Wenn ja, akzeptieren Sie bitte meine Antwort:)
.[[ ${(%):-%#} = \# ]] && echo root