首页 > 解决方案 > 以一个用户身份运行一些命令,并访问另一个用户设置的变量

问题描述

我的目标是:

我想跑:

  1. 一次多行
  2. 在另一个用户下
  3. 可以访问我正在运行的用户设置的变量

所以从这里:

ROOT_VAR='var-set-from-root'

cmd="
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
"

期望的结果是:

var-set-from-root
UserA
/home/UserA

到目前为止我已经尝试过:

1 用 bash 运行;双引号中包含的命令:

cmd="
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
"

sudo -u UserA bash -c "{$cmd}"

# result (has access to root var but still running as root):
var-set-from-root
root
/root

2 使用 bash 和 heredoc 中的命令运行

sudo -u UserA bash -c<<EOF
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
EOF

# result (error):
bash: -c: option requires an argument

3 在heredoc中使用su和命令运行,带单引号

su UserA <<'EOF'
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
EOF

# result (no access to root var but running as correct user):

UserA
/home/UserA

4 使用 su 和 heredoc 中的命令运行,不带引号

su UserA <<EOF
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
EOF

# result (has access to root var but still running as root):
var-set-from-root
root
/root

5 用 bash 运行;双引号中的命令;root var 作为参数传递:

cmd="
 echo $1
 echo `whoami`
 echo $HOME
"

sudo -u UserA bash -c "{$cmd}" $ROOT_VAR

# result (no access to root variable parameter):

root
/root

他们都不能从 root 用户访问变量集,同时在非 root 用户下运行。即使使用参数也可以吗?

标签: linuxbashmultilineubuntu-18.04

解决方案


对您的第一个示例稍作修改应该可以工作:

cmd="
 echo $ROOT_VAR
 echo \`whoami\`
 echo \$HOME
"

sudo -H -u UserA bash -c "{$cmd}"

-H需要在此基础上$HOME设置用户的变量。

\$HOME关于反斜杠,这里和之间的区别$ROOT_VAR非常棘手。当命令被解析时,$ROOT_VAR实际上被扩展为它的真实值。换句话说, 的值cmd如下:

cmd="
  echo var-set-from-root
  echo `whoami`
  echo $HOME
"

您需要使用反斜杠来避免在根环境中解析whoami和,而是将命令的执行传递给用户的 bash 本身。$HOME


推荐阅读