以下を使用して、各コマンドを別のユーザーとして実行できることを知っています。
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つの方法があります。
- Borgが通常自動的にインポートする環境変数である$BORG_PASSPHRASEを渡すことはできないようです。ユーザー間の権限の問題かもしれませんか?
- 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グループを共有させることをお勧めします。
- SSHを使用すると、バックアップユーザーのパスワードを変更でき、スクリプトは引き続き機能します。
- 概念証明分析後に共有グループを使用している場合は、ルート以外のアカウントがスクリプトを所有して実行できるソリューションに移行できます。これの利点は、ルートパスワードを共有する必要がないことです。
- ssh コマンドに環境変数を渡すことができます。例: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"