如何在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'
这里有几点要注意:
-
最后三个命令必须作为另一个使用
su
或sudo
用户运行。 在这个例子中有三个命令,但是假设还有更多… -
命令本身使用单引号和双引号。
上面的第二点阻止使用以下语法:
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