BASH スクリプトを root として実行します。別のユーザーとして実行されるコマンドをグループ化する適切な方法はありますか?

BASH スクリプトを root として実行します。別のユーザーとして実行されるコマンドをグループ化する適切な方法はありますか?

次のようにして、各コマンドを別のユーザーとして実行できることはわかっています。

su -s /bin/bash "command" - user

しかし、実行するコマンドがいくつかあり、すべての行に su を入れるよりも簡単な方法を探していました。

「ここからのすべてのコマンドは us​​erX として実行されます」と指定し、その後「userX としてコマンドの実行を停止します」(そしてスクリプトの残りの部分を root として実行し続けます) と指定するにはどうすればよいでしょうか?

ありがとう。

別のユーザーとして実行したいブロックは次のとおりです(@Jetchisel による回答から更新)。

#!/bin/bash
export BORG_PASSPHRASE="SUPERSECRETPASSWORD"

su - backup-user -s /bin/bash -c '
echo "$USER $(date +%F)" |& tee /pathto/_logs/test.log
borg info               \
    /pathto/repo          \
    |& tee -a /pathto/_logs/test.log
'
info_exit=$?{PIPESTATUS[0]}

if [ ${info_exit} = "0" ]; then
echo ">> test-SUCCESS <<"
elif [ ${info_exit} = "1" ]; then
echo ">> test WARNINGS <<"
else
echo ">> test FAILED <<"
fi

上記は 2 つの点を除いては機能します:

  1. Borg が通常自動的に取得する環境変数 $BORG_PASSPHRASE を渡すことができないようです。これはユーザー間の権限の問題でしょうか?
  2. info=exit を正しく渡していないようです。テストでは、Borg を完全に削除して echo を保持しましたが、スペルミスで「ech」と入力したため失敗しました。しかし、スクリプトはいずれにしても成功として報告します。

答え1

-c旗を試してみることができます

 OPTIONS
       -c, --command=command
            Pass command to the shell with the -c option.

何かのようなもの

su - "$user" -s /bin/bash -c 'command1;command1;command3;.....'

;または、コマンドを区切るには、 の代わりに新しい行を使用します。

su - "$user" -s /bin/bash -c '
  command1
  command2
  command3
  ...
'

コマンドを一重引用符で囲む必要がある場合は、引用符の付け方に注意してください。

答え2

bashスクリプトでは関数を使用することができます。タイプセットそれを簡単に達成するために;

#!/bin/bash

function1 () {
  echo "this is function1"
 }
function2 () {
  echo "this is function2"
}

su -c "$(typeset -f function1); function1" user1
su -c "$(typeset -f function2); function2" user2


exit 0

実行したいコマンドを関数内に配置すると、それぞれのユーザーがそれらのコマンドをすべて実行します。

注記:パスワードの問題を簡単に回避するために、スクリプトをrootとして実行します。

sudo su -c ./script.sh

答え3

えっと。私は StackExchange 初心者です。そうでなければ、これは回答ではなくコメントになります。コメントする権限がありません。ですから、皆さん、私を甘やかしてください。su ではなく ssh を使用することをお勧めします。また、root とバックアップ ユーザーに共通のプライマリ UNIX グループを共有することをお勧めします。

  1. ssh を使用すると、バックアップ ユーザーのパスワードを変更してもスクリプトは引き続き機能します。
  2. 共有グループを使用する場合は、概念実証分析の後で、root 以外のアカウントがスクリプトを所有して実行できるソリューションに移行できます。これには、root パスワードを共有する必要がないという利点があります。
  3. ssh コマンドで環境変数を渡すことができます... たとえば: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"

関連情報