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

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

我有一个 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这样您就不必转义双引号"

参考 :

转义bash函数参数以供su -c使用 - Thinbug

bash - 将参数传递给su提供的shell - 智库101 - 一个基于CC版权的问答分享平台

相关内容