我基本上需要这样做:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
这是行不通的。如何将环境变量 $DUMMY 传递给 su? -p 不能与 -l 一起使用。
答案1
专家提示:从来没有真正跑步的好理由sudo su
。要以不同用户身份运行命令,请使用sudo -u username command
。如果您想要 root shell,请运行sudo -i
或sudo -l
。如果你激活了root账户,也可以su
单独运行,但是sudo su
没什么用。是的,我知道你到处都能看到它。
也就是说,sudo
有一个-E
可以保留用户会话环境的开关:
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve
their existing environment variables. The security policy may
return an error if the user does not have permission to
preserve the environment.
因此,您首先需要导出变量,然后运行sudo -E
:
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
不需要bash -c
。但是,如果我运行sudo -Eu bob echo "$DUMMY"
,该变量会在启动 root shell 之前展开,因此它不会证明该命令实际上有效:
$ sudo -u bob echo $DUMMY ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY' ## works as expected
D:dummy
答案2
您无需调用登录 shell 即可完成此操作:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
或者:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
命令保留环境变量-p
的选项。su
答案3
-E 为我完成这项工作。来自男人sudo
——
-E
,--preserve-env
向安全策略表明用户希望保留其现有的环境变量。如果用户没有保护环境的权限,安全策略可能会返回错误。
答案4
我也遇到了这个问题,我通过将环境变量导出到配置文件中来修复。下面是我的示例代码:
echo export runner_token=$(echo $resp_json | jq -r '.token') >> /etc/profile
su -p - ubuntu -c '$HOME/actions-runner/config.sh --url https://github.com/${gh_repo_user}/${gh_repo_name} --token "$runner_token" --name MAC-AWS-RUNNER --labels ${gh_runner_labels}'