2013-07-20 36 views
55

已经有some existing questions在这里询问有关以另一个用户身份运行命令的问题。但是,问题和答案集中在单个命令而不是一长串命令。如何在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' 

有几个重要的点,这里要注意:

  • 最后3个命令都必须使用su或运行其他用户身份sudo。在这个例子中有三个命令,但假设还有更多...

  • 这些命令本身使用单引号和双引号。上述

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

su somebody -c "command" 

...由于命令本身包含引号。

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

+1

Unix stackexchange上运气不错吗? – icedwater

+0

现在请参阅http://stackoverflow.com/questions/37586811/pass-commands-as-input-to-another-command-su-ssh-sh-etc/37586820#37586820 – tripleee

回答

125

试试这个:

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中的变量替换。

+0

您,先生,是一位天才。我曾想过使用HEREDOC,但找不到正确的语法来使其工作。谢谢! –

+0

为什么'-c'标志不需要?没有'-c',我得到一个权限被拒绝的错误。 – rightfold

+0

当命令作为参数提供时,使用'-c',而不是从标准输入中读取。 – Barmar

5

我不使用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' 
0

此脚本检查当前运行脚本的用户是否是所需的用户。如果不是,则脚本将与所需用户一起重新执行。

#!/usr/bin/env bash 

TOKEN_USER_X=TOKEN_USER_X 
USER_X=peter # other user! 

SCRIPT_PATH=$(readlink -f "$BASH_SOURCE") 

if [[ "[email protected]" != "$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 
相关问题