Bash

以root身份執行的BASH腳本,以其他使用者身份執行的分組命令的整潔方式?

  • May 25, 2021

我知道我可以以不同的使用者身份執行每個命令:

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 完全保留的迴聲,但拼錯了 ’ech’ 失敗了。但是腳本無論如何都報告為成功。

你可以試試-cflag

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

如果您需要用單引號引用命令,則只需要處理引用即可。

您可以在 bash 腳本中使用函式以及typeset來輕鬆完成此任務;

#!/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

引用自:https://unix.stackexchange.com/questions/579076