72

別のユーザーとしてコマンドを実行することについて、ここで尋ねられた既存の質問がいくつかあります。ただし、質問と回答は、コマンドの長いグループではなく、1 つのコマンドに焦点を当てています。

たとえば、次のスクリプトを考えてみましょう。

#!/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最後の 3 つのコマンドは、またはを使用して別のユーザーとして実行する必要がありますsudo。この例では 3 つのコマンドがありましたが、さらに多くのコマンドがあったとします...

  • コマンド自体は、一重引用符と二重引用符を使用します。

上記の 2 番目のポイントにより、次の構文を使用できなくなります。

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

<<ヒアドキュメントを紹介します。次のトークンは区切り文字であり、区切り文字で始まる行までのすべてがコマンドへの標準入力として供給されます。区切り文字を一重引用符で囲むと、ヒアドキュメント内での変数の置換が防止されます。

于 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 に答える