linux - 以一个用户身份运行一些命令,并访问另一个用户设置的变量
问题描述
我的目标是:
我想跑:
- 一次多行
- 在另一个用户下
- 可以访问我正在运行的用户设置的变量
所以从这里:
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 用户下运行。即使使用参数也可以吗?
解决方案
对您的第一个示例稍作修改应该可以工作:
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
推荐阅读
- c - 为什么这个错误的 printf 语法不会在 c 中产生错误?
- c++ - 如何检查字段中输入的数字是否重复
- java - 在列表中查找特定记录并在该记录上方显示 5 条记录,在该记录下方显示 5 条记录
- javascript - 表单数据将作为空到 HttpContext.Current.Request
- python - 无法删除 matplotlib 中的先前绘图
- php - $_SESSION 登录 x 注销按钮脚本不运行,再运行一个,因为它被标记为重复
- html - HTML 和 body 没有 100% 的宽度
- java - 如何使用 Java 以给定格式输出数据库结果
- c# - C# WinForms RichTextBox 鼠标中键滚动:防止箭头光标
- java - 使用方法来初始化按钮