
我正在嘗試編寫一個 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 的返回狀態將處於。