我的目标是
我要跑步:
因此,此:
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用户下运行。即使使用参数也可以吗?
答案 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
sh
或bash
,有时对未展开的多行命令使用<<'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"'
您完全可以选择要传递的内容。