次のようにして、各コマンドを別のユーザーとして実行できることはわかっています。
su -s /bin/bash "command" - user
しかし、実行するコマンドがいくつかあり、すべての行に su を入れるよりも簡単な方法を探していました。
「ここからのすべてのコマンドは userX として実行されます」と指定し、その後「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 つの点を除いては機能します:
- Borg が通常自動的に取得する環境変数 $BORG_PASSPHRASE を渡すことができないようです。これはユーザー間の権限の問題でしょうか?
- 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 グループを共有することをお勧めします。
- ssh を使用すると、バックアップ ユーザーのパスワードを変更してもスクリプトは引き続き機能します。
- 共有グループを使用する場合は、概念実証分析の後で、root 以外のアカウントがスクリプトを所有して実行できるソリューションに移行できます。これには、root パスワードを共有する必要がないという利点があります。
- ssh コマンドで環境変数を渡すことができます... たとえば: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"