rootとして実行され、他のユーザーとして実行されるBASHスクリプトのコマンドをグループ化するきちんとした方法は何ですか?

rootとして実行され、他のユーザーとして実行されるBASHスクリプトのコマンドをグループ化するきちんとした方法は何ですか?

以下を使用して、各コマンドを別のユーザーとして実行できることを知っています。

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

しかし、実行するコマンドが複数あり、すべての行にsuを追加するよりもきちんとした方法を探しています。

「ここのすべてのコマンドはuserXで実行されます」と言い、「userXでコマンドの実行を停止します」と言います。

ありがとうございます。

これは他のユーザーとして実行したいブロックです(@ 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が保存したエコーを完全に削除しましたが、スペルを「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

よく。私はスタック交換を初めて使用します。そうでなければ、これは答えではなくコメントになります。コメントする月の代表はありません。それでは皆さん。私に楽にしてください! suの代わりにsshを使用することをお勧めします。 rootユーザーとバックアップユーザーに共通のデフォルトのUNIXグループを共有させることをお勧めします。

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

関連情報