Bash
如何更改使用者內部功能
我在 centos7 上有一個 bash 腳本,我需要以不同的使用者身份執行一些命令。但它似乎
sudo
在函式外部按預期工作,但在 bash 函式內部不起作用。我執行腳本為ssh centos@myhost.com 'bash -s' < script.sh
test(){ sudo -Eu root bash echo "inside $(whoami)" # other commands ... } test sudo -Eu root bash echo "outside $(whoami)"
執行這個
ssh centos@myhost.com 'bash -s' < script.sh
印刷:
outside root inside centos
root
使用者作為可重複性的範例。這個結果背後的原因是什麼?如何以不同的使用者身份在函式內執行一堆命令?
不要這樣做。
以錯誤的順序獲取兩行輸出應該暗示有問題。
當您使用執行腳本時
ssh centos@myhost.com 'bash -s' < script.sh
發生以下情況:
- 該腳本被傳遞到
bash -s
shell 標準輸入流上。- 腳本定義
test
函式並呼叫它。- 該
sudo bash
函式中的命令啟動一個 root shell。- 這個 shell 繼承了標準輸入流,也就是腳本。
- 根 shell 從函式呼叫之後的點繼續讀取腳本。這樣做是因為這是流此時所在的位置。
現在你有一個從
test
函式內部啟動的 root shell,它在呼叫之後執行指令test
。
- 它啟動第二個根shell,它繼承標準輸入流(即shell 腳本流)。
你現在有一個
centos
shell 執行一個 root shell,執行一個 root shell。
- 第二個 root shell 執行
echo "outside $(whoami)"
輸出outside root
,這是腳本的最後一行。- 沒有什麼要讀的了,所以第二個 root shell 終止了。
- 第一個 root shell 也是如此。
- 原始
bash -s
shell 執行echo "inside $(whoami)"
(因為它是之前開始執行的函式的一部分),輸出inside centos
.- shell 函式呼叫退出,並且由於腳本的其餘部分已經被兩個根 shell 讀取,原始 shell 沒有更多內容可讀取並終止。
sudo
嚴格用於執行另一個命令(或啟動互動式 shell)。使用者更改僅適用於該其他命令。當命令終止時,您將恢復為原始使用者。您不能sudo
在腳本中間使用“切換到另一個使用者”,然後以該其他使用者的身份執行該腳本的一部分(當然,除非您故意編寫要以上面解開的奇怪方式執行的腳本,但這種編碼屬於混淆程式碼競賽)。要在腳本中以 root 身份執行一組命令,您必須將這些命令提供給
sudo
呼叫。例如:sudo bash -c 'echo "Now running as $USER"; echo "whoami outputs $(whoami)"'
命令退出後
sudo bash -c
,您將恢復為原始使用者。總是。