以另一个用户身份执行命令时如何传递环境变量?

以另一个用户身份执行命令时如何传递环境变量?

作为 root 我做了

# WWWFOLDER=myproject
# echo $WWWFOLDER
myproject
# su - anothershelluser /bin/bash -c "echo $WWWFOLDER"

#

正如你所看到的,我没有打印任何内容。

我已经尝试过,但没有成功

# su - anothershelluser /bin/bash -c "echo ${WWWFOLDER}"

# su - anothershelluser /bin/bash -c 'echo ${WWWFOLDER}'

# su - anothershelluser /bin/bash -c 'echo $WWWFOLDER'

问题

如何将 WWWFOLDER 传递到要执行的 bash 命令中?

答案1

传递-tosu是明确要求它擦除环境并模拟登录。

只需放下-.

此外,在大多数su实现中,您传递的-c是要传递到目标用户的登录 shell 的代码,因此您需要以该 shell 的语法向其传递代码。如果那个 shell 是类似 Bourne 的:

# export VAR=value
# su anothershelluser -c 'printf "%s\n" "$VAR"'
value

如果您需要执行 bash shell,无论目标用户的登录 shell 是什么(但为什么要这样做),则需要使用目标用户的登录 shell 的语法构造代码,使其运行该 bash壳。

如果它是像《谍影重重》那样的,那可能是:

su anothershelluser -c 'exec bash -c '\''printf "%s\n" "$VAR"'\'

使用sudo代替su会更容易:

sudo -E -u anothershelluser bash -c 'printf "%s\n" "$VAR"'

-E为了保护环境;注意sudo不一定会保护全部环境)。

zsh shell 内置支持通过分配 UID、EUID、GID、EGID 或 USERNAME 变量来更改 uid/gids。在那里,这只是一个问题:

(USERNAME=anothershelluser; bash -c 'printf "%s\n" "$VAR"')

(这也会跳过 su/sudo 执行的所有额外操作,例如调用 pam 堆栈、日志记录、添加额外的 pty 包装等)。

相关内容