Bash

如何更改使用者內部功能

  • February 21, 2019

我在 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

發生以下情況:

  1. 該腳本被傳遞到bash -sshell 標準輸入流上。
  2. 腳本定義test函式並呼叫它。
  3. sudo bash函式中的命令啟動一個 root shell。
  4. 這個 shell 繼承了標準輸入流,也就是腳本。
  5. 根 shell 從函式呼叫之後的點繼續讀取腳本。這樣做是因為這是流此時所在的位置。

現在你有一個從test函式內部啟動的 root shell,它在呼叫之後執行指令test

  1. 它啟動第二個根shell,它繼承標準輸入流(即shell 腳本流)。

你現在有一個centosshell 執行一個 root shell,執行一個 root shell。

  1. 第二個 root shell 執行echo "outside $(whoami)"輸出outside root,這是腳本的最後一行。
  2. 沒有什麼要讀的了,所以第二個 root shell 終止了。
  3. 第一個 root shell 也是如此。
  4. 原始bash -sshell 執行echo "inside $(whoami)"(因為它是之前開始執行的函式的一部分),輸出inside centos.
  5. shell 函式呼叫退出,並且由於腳本的其餘部分已經被兩個根 shell 讀取,原始 shell 沒有更多內容可讀取並終止。

sudo嚴格用於執行另一個命令(或啟動互動式 shell)。使用者更改僅適用於該其他命令。當命令終止時,您將恢復為原始使用者。您不能sudo在腳本中間使用“切換到另一個使用者”,然後以該其他使用者的身份執行該腳本的一部分(當然,除非您故意編寫要以上面解開的奇怪方式執行的腳本,但這種編碼屬於混淆程式碼競賽)。

要在腳本中以 root 身份執行一組命令,您必須將這些命令提供給sudo呼叫。例如:

sudo bash -c 'echo "Now running as $USER"; echo "whoami outputs $(whoami)"'

命令退出後sudo bash -c,您將恢復為原始使用者。總是。

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