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
  ...
'

単一引用符でコマンドを引用する必要がある場合は、引用符を処理するだけです。

おすすめ記事