如何以其他使用者身分執行互動式命令

如何以其他使用者身分執行互動式命令

我正在嘗試編寫一個 bash 腳本

  • 上下文切換到另一個使用者(在本例中為 root)
  • 執行一組命令我。建立一個使用者(互動式提示呼叫者輸入使用者名稱)然後二.設定該用戶的密碼
  • 得到一個回傳值
  • 然後繼續做一些事情,並傳回值

到目前為止我已經嘗試過 << EOF 輸入(圖。),一個函數(圖2),並拉動/運行一個單獨的腳本(圖3)。但是我還沒有得到我需要的結果。

sudo su - << 'EOF'
# do stuff...
EOF

圖。

function myfunc()
{
    local  myresult='some value'
    echo "$myresult"
}

圖2

sudo su - -c bash <(curl -fksSL https://<my-script-location>.sh)

圖3

答案1

sudo su - << 'EOF'
# do stuff...
EOF

這是可行的,但有一個限制:腳本透過其標準輸入傳遞到 shell,因此您無法將標準輸入用於其他用途,例如讀取要建立的使用者的名稱。

保留標準輸入的簡單方法是將 shell 命令作為參數傳遞。

請注意,這sudo su是多餘的 -sudo以 root 身分執行指定的命令,這su也是唯一的目的。如果您想以 root 身分執行登入 shell(這裡可能是不必要的)或只是以 root 身分執行 shell,請使用sudo -i而不是。sudo su -sudo sh

sudo sh -c '
  # do stuff...
'

這使得在 shell 程式碼片段中使用單引號變得很尷尬。您可以'\''在單引號文字內放置單引號。如果你想保留here文件結構,有幾種方法。最直接的就是傳here文檔在不同的描述符上。然而,這需要closefrom_override在 sudo 配置中啟動該選項,預設並非如此;預設情況下,sudo關閉除 stdin、stdout 和 stderr 之外的所有檔案描述符。

sudo -C 3 sh -c '. /dev/fd/3' 3<<'EOF'
# do stuff...
EOF

如果您希望程式碼可移植到未啟動此選項的計算機,則可以從定界文件中讀取腳本並將其作為參數傳遞給 shell。

script=$(cat <<'EOF'
# do stuff...
EOF
)
sudo sh -c "$script"

或者,如果您希望 sudoed 腳本能夠從終端機讀取,則可以在標準輸入上傳遞腳本主體。這種方法的一個限制是它不允許重定向整個腳本的輸入。

sudo sh <<'EOF'
exec </dev/tty
# do stuff...
EOF

答案2

假設調用的用戶sudo可以分配tty

Defaults someuser:requiretty

ans 已被授予以 root 身分執行所需命令的權限:

Cmnd_Alias STUFF = /usr/bin/passwd, /usr/sbin/useradd
someuser ALL = STUFF

包含呼叫的腳本sudo將是互動的。您可以將使用者名稱作為位置參數傳遞:

sudo useradd $1
sudo passwd $1

並像往常一樣使用 來檢查返回狀態$?

答案3

su -c '. /dev/fd/4' 4<<\SCRIPT
    ...automated stuff here...
    ....then for interactive...
    exec </dev/tty
SCRIPT

應該做。定制它以滿足您的需求 - 但它會切換上下文,並且$?當您完成它時,shell 的返回狀態將處於。

相關內容