我有一个 bash 脚本,它应该接受一些参数,然后在不同的用户中运行:test.sh
#!/bin/bash
sudo su user2 <<'EOF'
echo $1
EOF
然而它打印空白:
$ ./test.sh haha
我知道这是因为环境变量被重置(?)。我怎样才能通过这个论点?安全方面,我听说我不应该禁用环境重置。我想到解决这个问题的唯一方法是写入$1
文件,然后由 user2 再次读回。但我想应该有更好的方法。
答案1
如果您希望整个脚本以另一个用户身份运行,我通常的做法是将类似于以下内容的内容添加到脚本的最顶部:
target_user="foo"
if [ "$(whoami)" != "$target_user" ]; then
exec sudo -u "$target_user" -- "$0" "$@"
fi
请注意,我sudo
在这里使用而不是su
.su
使得正确传递参数变得非常困难,而sudo
没有这个问题。
如果您只想运行一小段代码,您也可以执行以下操作:
target_user="foo"
sudo -u "$target_user" sh -s "$@" <<'EOF'
echo "$@"
EOF
这将启动sh
,将当前脚本的参数传递给它,然后执行通过heredoc提供的脚本。
答案2
通过将 放在EOF
引号中,您可以有效地引用“此处文档”( echo $1
),以便$1
由 shell 进行解释user2
。但该 shell 没有任何位置参数。我现在无法测试这些,但以下是一些可能有效的方法:
不要引用
EOF
:sudo su user2 << EOF echo $1 EOF
通过环境传递值:
export my_val="$1" sudo su user2 << 'EOF' echo "$my_val" EOF
答案3
这可能有效:
#!/bin/bash
su - user2 -c 'echo "$0" "$@"' -- "$@"
使用简单的引号'
来传递命令参数,su
这样您就不必转义双引号"
。
参考 :