如何在 shell 脚本中访问 `$SUDO_USER` 的环境变量?

如何在 shell 脚本中访问 `$SUDO_USER` 的环境变量?
  • $USER$SHELL环境变量是/bin/zsh
  • 我的根的$SHELL环境变量是/bin/bash

我正在运行 Unix shell 脚本作为sudo.在此脚本中,我需要检查$SHELLenv 变量 是否$SUDO_USER/bin/zsh。然而,在这个命令中:

if [ $SHELL != "/bin/zsh" ]; then
  pacman -S --needed --no-confirm zsh
  sudo -u $SUDO_USER chsh -s /usr/bin/zsh
fi

$SHELL实际上 root 的 env 是可行的。如何获取$SHELLof$SUDO_USER的呢?

谢谢。

编辑 最好的方法是除了该$SHELL变量之外还可以是其他环境变量。

答案1

使用选项-E, --preserve-envsudo承载环境。例如sudo -E ./test.sh

请注意不鼓励允许任何环境。请参阅命令环境中的部分man sudoers

答案2

通常,$SHELL环境变量是根据用户/etc/passwd输入的第 7 个字段设置的,因此如果您正在寻找$SUDO_USER,因此如果您默认shell,你可以直接从那里查找:

if [ $(getent passwd $SUDO_USER | cut -d: -f 7) != "/bin/zsh" ]; then
  ...

但是,如果您想要发出命令的确切 shell 的值sudo,则需要查看祖父进程的环境:

get_ppid() {
  ps -ho ppid -p "$1" | tr -d " "
}

SUDO_USERS_SHELLPID=$(get_ppid $( get_ppid $$ ))  # get the PID of this shell's grandparent

# if you want the actual pathname of the shell used as the grandparent process:
if [ $(readlink /proc/$SUDO_USERS_SHELLPID/exe) != "/bin/zsh" ]; then
  ...

# or if you want the $SHELL environment value from the grandparent process:
if [ $(strings /proc/$SUDO_USERS_SHELLPID/environ | awk -F= '/^SHELL=/{ print $2; }') != "/bin/zsh" ]; then
  ...

相关内容