以一个用户身份运行一些命令,并访问另一个用户设置的变量

时间:2019-01-08 23:39:36

标签: linux bash multiline ubuntu-18.04

我的目标是

我要跑步:

  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在Heredoc中使用命令运行bash

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

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

3用su和单引号在Heredoc中运行命令

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用户下运行。即使使用参数也可以吗?

2 个答案:

答案 0 :(得分:1)

对第一个示例进行一些修改即可:

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

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

-H用来设置用户based on this$HOME变量。

关于反斜线,\$HOME$ROOT_VAR之间的区别非常棘手。解析命令后,$ROOT_VAR实际上会扩展为其实际值。换句话说,cmd的值如下:

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

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

答案 1 :(得分:1)

# as root
var=1
export var
sudo -E -u kamil sh -c 'echo "$(whoami) var = $var"'
echo "$(whoami) var = $var"

将输出:

kamil var = 1
root var = 1
  1. sudo让您以其他用户身份运行
  2. sueo -E允许保存环境,请参见man sudo
  3. 在进行sudo后,您需要执行一个程序-通常为脚本执行shbash,有时对未展开的多行命令使用<<'EOF'执行该程序

关注者:

export var=1
sudo -E -u kamil sh <<'EOF'
echo "I am $(whoami) and..."
echo "var = $var"
echo "Let's change it!"
var=2
echo "var = $var"
EOF
echo "$(whoami) var = $var"

将输出:

I am kamil and...
var = 1
Let's change it!
var = 2
root var = 1

使用env可以更加明确:

sudo -u kamil env var="$var" sh -c 'echo "$var"'

您完全可以选择要传递的内容。

相关问题