我知道我可以使用以下命令作為不同用戶運行每個命令:
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 保留的 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 群組。
- 使用 ssh 可以更改備份使用者密碼,並且您的腳本仍然可以工作。
- 如果您稍後使用共享群組(在概念驗證分析之後),您可以遷移到 root 以外的帳戶可以擁有並執行腳本的解決方案。這樣做的好處是您不必共享 root 密碼。
- 您可以在 ssh 指令中傳遞環境變數...例如: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"