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
以上工作,但有兩件事:
- 我似乎無法傳遞 Borg 通常自動獲取的環境變數:$BORG_PASSPHRASE。這可能是使用者之間的權限問題嗎?
- 它似乎沒有正確傳遞 info=exit 。對於測試,我刪除了 Borg 完全保留的迴聲,但拼錯了 ’ech’ 失敗了。但是腳本無論如何都報告為成功。
你可以試試
-c
flagOPTIONS -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