在我的 .zshrc 中,我有一些命令可以启动各种程序的实例,例如 Mozilla Firefox 和 Evolution。我显然不想以 root 身份启动它们,所以我想在启动它们之前检查我是否是 root。我该怎么做?
答案1
您可以使用例如这样的条件语句:
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
它首先检查真实用户ID或者有效用户 ID是zero
, 也就是说root
。
如果是,它将按照用户在变量中定义的方式sudo
运行变量中定义的程序。(如果只想要警告消息,则可以省略此行。)PRGCMD
PRGUSR
${(z)PRGCMD}
分裂就像 zsh 命令行一样如果PRGCMD
包含空格,即程序的参数。
一个简短的变体,仅以非 root 身份运行该程序:[[ $UID != 0 || $EUID != 0 ]] && firefox
此外,你也许想要将其包含%#
在你的提示中,这样你就可以看到你当前的 shell 是具有特权的。来自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.
代码判断shell 正在以特权运行privasserted()
(在中定义utils.c
)在我看来不能在 shell 代码中完成,所以如果你想要完全相同的行为,最好解析%#
提示扩展的输出:
[[ $(print -P "%#") == '#' ]] && echo shell privileged || echo shell not privileged