将参数传递给另一个用户运行的命令

Sep*_*man 2 shell su sudo shell-script arguments

我有一个 bash 脚本,它应该接受一些参数,然后在不同的用户中运行: test.sh

#!/bin/bash
sudo su user2 <<'EOF'
echo $1
EOF
Run Code Online (Sandbox Code Playgroud)

但是它打印空白:

$ ./test.sh haha
Run Code Online (Sandbox Code Playgroud)

我知道这是因为环境变量被重置(?)。我怎样才能通过这个论点?安全方面我听说我不应该禁用环境重置。我想到解决这个问题的唯一方法是写入$1文件,然后由 user2 再次读取它。但我想应该有更好的方法。

phe*_*mer 9

如果您希望整个脚本以另一个用户身份运行,我通常使用的方法是在脚本的最顶部添加类似于以下内容的内容:

target_user="foo"
if [ "$(whoami)" != "$target_user" ]; then
  exec sudo -u "$target_user" -- "$0" "$@"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,我sudo在这里使用而不是su. su使得正确传递参数变得非常困难,而sudo没有这个问题。

如果您只想运行一小段代码,您也可以执行以下操作:

target_user="foo"
sudo -u "$target_user" sh -s "$@" <<'EOF'
  echo "$@"
EOF
Run Code Online (Sandbox Code Playgroud)

这将启动sh,将当前脚本的参数传递给它,然后执行通过 heredoc 提供的脚本。