此处已询问some existing questions有关以另一个用户身份运行命令的问题。但是,问题和答案集中在单个命令而不是一长串命令。
例如,请考虑以下脚本:
#!/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"
...因为命令本身包含引号。
将命令“分组”并在另一个用户帐户下运行它们的正确方法是什么?
答案 0 :(得分:142)
试试这个:
su somebody <<'EOF'
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
EOF
<<
引入了 here-doc 。下一个标记是分隔符,直到以分隔符开头的行的所有内容都作为标准输入提供给命令。将分隔符放在单引号中会阻止here-doc中的变量替换。
答案 1 :(得分:7)
我对bash-foo不是那么好,所以有一种更优雅的方式,但我过去通过使用多个脚本和“驱动程序”来解决这个问题
E.g。
驱动程序
#!/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'
答案 2 :(得分:0)
此脚本检查运行脚本的当前用户是否为所需用户。如果没有,则使用所需用户重新执行脚本。
#!/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