如何在Bash中以另一个用户身份执行一组命令?

现在已经有一些关于以另一个用户的身份运行命令的问题 。 然而,问题和答案集中在一个单一的命令,而不是一个长长的命令组。

例如,请考虑以下脚本:

#!/bin/bash set -e root_command -p param1 # run as root # these commands must be run as another user command1 -p 'parameter with "quotes" inline' command2 -p 'parameter with "quotes" inline' command3 -p 'parameter with "quotes" inline' 

这里有几点要注意:

  • 最后三个命令必须作为另一个使用susudo用户运行。 在这个例子中有三个命令,但是假设还有更多…

  • 命令本身使用单引号和双引号。

上面的第二点阻止使用以下语法:

 su somebody -c "command" 

…因为命令本身包含引号。

什么是正确的方式来“分组”的命令,并在另一个用户帐户下运行它们?

尝试这个:

 su somebody <<'EOF' command1 -p 'parameter with "quotes" inline' command2 -p 'parameter with "quotes" inline' command3 -p 'parameter with "quotes" inline' EOF 

<<介绍一下here-doc 。 下一个标记是分隔符,直到以分隔符开始的行的所有内容都将作为标准input提供给命令。 将分隔符放在单引号中可防止在here-doc中进行variablesreplace。

我对bash-foo并不是很了不起,所以有一种更加优雅的方式,但是我过去通过使用多个脚本和一个“驱动程序”来解决这个问题,

例如

司机

 #!/bin/bash set -e su root script1 su somebody script2 

SCRIPT1

 #!/bin/bash set -e root_command -p param1 # run as root 

SCRIPT2

 #!/bin/bash set -e # these commands must be run as another user command1 -p 'parameter with "quotes" inline' command2 -p 'parameter with "quotes" inline' command3 -p 'parameter with "quotes" inline' 
 #!/usr/bin/env bash TOKEN_USER_X=TOKEN_USER_X USER_X=peter # other user! SCRIPT_PATH=$(readlink -f "$BASH_SOURCE") if [[ "$@" != "$TOKEN_USER_X" ]]; then ###### RUN THIS PART AS the user who started the script echo "This script is $SCRIPT_PATH" echo -n "Current user: " echo $USER read -p "insert: " echo "got $REPLY" su - $USER_X -c "$SCRIPT_PATH $TOKEN_USER_X" # execute code below after else (marked #TOKEN_USER_X) else #TOKEN_USER_X -- come here only if script received one parameter TOKEN_USER_X ###### RUN THIS PART AS USER peter echo echo "Now this script is $SCRIPT_PATH" echo -n "Current user: " echo $USER read -p "insert: " echo "got $REPLY" exit 0 fi echo echo "Back to initial user..." echo -n "Current user: " echo $USER