72

这里已经有一些关于以其他用户身份运行命令的问题。但是,问题和答案集中在单个命令而不是一长串命令上。

例如,考虑以下脚本:

#!/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'

这里有几点需要注意:

  • 最后三个命令必须以另一个用户身份使用suor运行sudo。在示例中,有三个命令,但假设还有更多...

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

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

su somebody -c "command"

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

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

4

3 回答 3

165

尝试这个:

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

于 2013-07-20T03:20:36.210 回答
8

我对 Bash-foo 不是很好,所以肯定会有更优雅的方式,但我过去通过使用多个脚本和一个“驱动程序”来解决这个问题。

例如,

司机

#!/bin/bash
set -e

su root script1
su somebody script2

脚本1

#!/bin/bash
set -e

root_command -p param1  # Run as root

脚本2

#!/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'
于 2013-07-20T03:16:03.247 回答
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
于 2014-06-27T21:42:42.883 回答