作为 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 包装等)。