以 root 身分執行的 BASH 腳本,以另一個使用者身分執行的分組命令的整潔方法?

以 root 身分執行的 BASH 腳本,以另一個使用者身分執行的分組命令的整潔方法?

我知道我可以使用以下命令作為不同用戶運行每個命令:

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

上面的方法有效,但有兩件事:

  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 的新手。否則這將是評論而不是答案。我沒有代表發表評論。所以夥計們。對我輕鬆一點!我建議您使用 ssh 而不是 su。我建議讓 root 和備份用戶共享一個公共的主要 UNIX 群組。

  1. 使用 ssh 可以更改備份使用者密碼,並且您的腳本仍然可以工作。
  2. 如果您稍後使用共享群組(在概念驗證分析之後),您可以遷移到 root 以外的帳戶可以擁有並執行腳本的解決方案。這樣做的好處是您不必共享 root 密碼。
  3. 您可以在 ssh 指令中傳遞環境變數...例如: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"

相關內容