运行 一些命令作为一个用户,并访问由另一个用户设置的变量
Run some commands as one user, and access variables set by another user
我的目标是:
我想运行:
- 一次多行
- 在另一个用户下
- 可以访问用户设置的变量,我 运行来自
所以从这个:
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 运行 with bash with commands in 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 运行 在 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;双引号中的命令;作为参数传递的根变量:
cmd="
echo
echo `whoami`
echo $HOME
"
sudo -u UserA bash -c "{$cmd}" $ROOT_VAR
# result (no access to root variable parameter):
root
/root
其中 None 可以从 root 用户访问变量集,同时 运行ning 在非 root 用户下。使用参数也可以吗?
对您的第一个示例稍作修改即可:
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 本身。
# 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
- sudo 让你 运行 作为另一个用户
- sueo -E 允许保留环境,参见 man sudo
- 执行 sudo 后,您需要执行一个程序 - 通常
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"'
您可以准确选择传递的内容。
我的目标是:
我想运行:
- 一次多行
- 在另一个用户下
- 可以访问用户设置的变量,我 运行来自
所以从这个:
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 运行 with bash with commands in 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 运行 在 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;双引号中的命令;作为参数传递的根变量:
cmd="
echo
echo `whoami`
echo $HOME
"
sudo -u UserA bash -c "{$cmd}" $ROOT_VAR
# result (no access to root variable parameter):
root
/root
其中 None 可以从 root 用户访问变量集,同时 运行ning 在非 root 用户下。使用参数也可以吗?
对您的第一个示例稍作修改即可:
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 本身。
# 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
- sudo 让你 运行 作为另一个用户
- sueo -E 允许保留环境,参见 man sudo
- 执行 sudo 后,您需要执行一个程序 - 通常
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"'
您可以准确选择传递的内容。