【问题标题】:Run some commands as one user, and access variables set by another user以一个用户身份运行一些命令,并访问另一个用户设置的变量
【发布时间】:2019-01-08 23:39:36
【问题描述】:

我的目标:

我想跑步:

  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 使用 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 在heredoc中使用su和命令运行,不带引号

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

【问题讨论】:

  • this 有帮助吗?
  • 您的第一个示例实际上可以在 Ubuntu 18.04 下运行。我在 root 下尝试过,它成功了:whoami &amp;&amp; TEST="1" &amp;&amp; sudo -u nav bash -c "echo $TEST &amp;&amp; whoami &amp;&amp; echo $HOME" 输出为 root 1 nav /home/nav
  • @TheNavigat 奇怪....我在根目录下复制/粘贴/修改用户/运行您的命令,输出为:root 1 UserA /root 如果我su UserAecho $HOME 我得到/home/UserA这是在 Ubuntu 18.04.1 LTS 中
  • 是的,你是对的。我的错。这解决了它:unix.stackexchange.com/a/177011/215614。这基本上是因为几件事:您需要-i 来包含用户的环境,并需要\$HOME 来确保美元符号实际上正确传递给命令,而不是传递root 自己的HOME。

标签: linux bash multiline ubuntu-18.04


【解决方案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
"

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

【讨论】:

  • 第一部分中的示例是否为您运行且没有错误?我明白了:mesg: cannot open /dev/pts/0: Permission denied bash: -c: line 1: syntax error: unexpected end of file
  • 我无法让-i 工作,正如我在第一条评论中提到的那样。但这确实输出了我想要的结果:sudo -H -u zteed998 bash -c "{$cmd}" 所以如果你相应地更新你的答案,我会接受你的答案。
  • 我的错。看起来由于-i 的工作方式,命令必须使用&amp;&amp; 左右加入才能工作。我没有正确测试它。 -H 有效,实际上比 -i 更具体,所以我修改了答案以反映这一点。谢谢!
  • 它确实解决了我的问题。请注意,命令(此处为 cmd)只能像这样使用,因为它不适用于单行。另外,避免使用 su 命令。
【解决方案2】:
# 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 用于脚本,有时使用 &lt;&lt;'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"'

您可以在哪里准确选择要传递的内容。

【讨论】:

  • 这与@TheNavigat 的答案有相同的问题,即$HOME 正在输出/root。使用-H 开关,它可以正确输出为/home/UserA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多