App Service 提供對執行中的應用程式容器經驗證的存取,用於故障排除與管理任務。 將容器存取視為特權操作,只授予需要該存取權限的使用者存取權限。
App Service 提供對託管於 Windows 自訂容器中的應用程式進行基於瀏覽器的 SSH 存取。 瀏覽器會話不需要特殊的影像設定。
Azure CLI az webapp exec 指令僅支援 Linux 網頁應用程式。 請勿在 Windows 應用程式 服務方案中使用本文中的 Linux CLI 範例。
對於內建和自訂的 Linux 容器,較新的瀏覽器終端機和 az webapp exec 會使用 Kudu 作為認證代理,以連接正在運行的容器。 這些選項不需要你安裝 SSH 伺服器、嵌入 SSH 密碼、暴露 SSH 埠口,或是在自訂映像中啟動 SSH 守護程序。 舊有的 Kudu WebSSH 及對 az webapp ssh 的存取可能仍需自訂映像檔中的 SSH 伺服器。
使用 Azure 入口網站進行瀏覽器工作階段,或使用預覽az webapp exec指令進行本機終端機工作階段或中斷連線的命令執行。 瀏覽器終端機需要 /bin/bash 在映像檔中,且目前不支援選擇其他 shell。 如果圖片有不同的外殼,請改用 az webapp exec --shell /bin/sh。 沒有命令殼層的映像檔,包括 distroless 映像檔,無法開啟互動式工作階段。
Prerequisites
- 應用程式及其容器正在執行。
- 你已被授權存取該應用程式的 SCM/Kudu 網站。 關於權限,請參見 存取 Kudu 所需的 RBAC 權限。
- 你的客戶端有 SCM 端點的網路存取權。 如果無法連線,請檢查應用程式的 存取限制 和私有網路設定。
- 針對 CLI 範例,安裝 Azure CLI 2.90.0 或更新版本並登入。 使用
az version來檢查您的版本。 如果其 CLI 符合此要求,你也可以使用 Azure Cloud Shell。 - 對於 CLI 互動式會話,請使用互動終端機和存在於映像中的 shell。 預設為
/bin/bash;對於沒有 bash 的圖片,如果可使用該 shell,請指定--shell /bin/sh。
在瀏覽器中開啟 SSH 工作階段
你的應用程式和容器必須在你開啟瀏覽器工作階段前先執行。
在 Azure 入口網站,開啟你的 App Service 應用程式。 在 開發工具中,選擇 SSH,然後選擇 Go。 如果被要求登入,請用你的 Azure 帳號登入。
會話會在瀏覽器開啟,你可以在應用程式容器內執行指令。
使用 Azure CLI 開啟 SSH 工作階段
預覽 az webapp exec 指令會在你的應用程式主容器中開啟一個互動式 shell。 這個工作階段會使用你在 Windows、macOS 和 Linux 上的本地終端機;它不會開啟瀏覽器。
az webapp exec --resource-group <resource-group-name> --name <app-name>
對於使用 /bin/sh 而非 bash 的映像檔:
az webapp exec --resource-group <resource-group-name> --name <app-name> --shell /bin/sh
你可以在這個工作階段執行指令並檢查它們的輸出。 例如,如果映像中已安裝,請使用 top。 要檢查 SCM/Kudu 容器而非應用程式容器:
az webapp exec --resource-group <resource-group-name> --name <app-name> --target kudu
應用程式和 Kudu 容器是不同的環境。 在應用程式容器中執行依賴您應用程式的執行階段、相依性或網路連線的指令。
選擇實例或部署位置
預設情況下,CLI 會連接到一個應用程式實例。 若要尋找執行個體 ID:
az webapp list-instances --resource-group <resource-group-name> --name <app-name> --output table
連結到一個具體的執行個體:
az webapp exec --resource-group <resource-group-name> --name <app-name> --instance <instance-id>
新增 --slot <slot-name> 以存取部署位置。 選取插槽的實例時,也要將 --slot 加到 az webapp list-instances。
互動式 Shell 模式一次只支援一個實例。
在沒有互動式工作階段的情況下執行指令
使用 --mode execute 在不開啟終端機會話的情況下,向主應用程式容器提交指令。 此指令會以分離模式執行。 此模式適合背景診斷或其他不需要立即輸出的工作。
Important
執行模式是fire-and-forget。 帶有狀態 accepted 的結果僅確認請求已被接受,並不代表指令已執行、完成或成功。 CLI 不會回傳遠端指令的標準輸出、標準錯誤或退出碼。 提交失敗會產生 CLI 錯誤,但成功調用 CLI 並不代表遠端執行成功。 當你需要立即觀察結果時,可以使用互動式 shell。
直接執行程式
用 --command 來指定程式及其參數。 引用整條指令:
az webapp exec --resource-group <resource-group-name> --name <app-name> --mode execute --command "python3 /home/site/wwwroot/scripts/diagnostics.py" --working-directory /home/site/wwwroot --instance <instance-id>
用你應用程式中部署的腳本取代腳本路徑。 執行檔及其相依關係必須存在於容器中。
--command 不會解譯如 >、| 或 && 等 shell 運算子。 需要 shell 時,請改用 --shell-command。 這兩種選擇是互斥的。
擷取輸出與檢查是否完成
以下範例使用了 Bash 用戶端引號用法,例如在 Cloud Shell 中。 它會向一個實例提交唯讀診斷指令,並分別記錄其輸出與退出狀態。 每次調用時,將 <instance-id> 替換為新的識別碼,並將 az webapp list-instances 替換為來自 <run-id> 的 ID。
az webapp exec --resource-group <resource-group-name> --name <app-name> \
--mode execute --instance <instance-id> --shell /bin/sh \
--shell-command 'uname -a > /home/LogFiles/diagnostics-<run-id>.log 2>&1; result=$?; printf "%s\n" "$result" > /home/LogFiles/diagnostics-<run-id>.exit'
請確認 /bin/sh 和診斷指令存在,且 /home/LogFiles 存在且可寫入。
/home 在自訂容器中的持久性取決於應用程式的 儲存設定。 單引號能防止用戶端 shell 在請求抵達容器之前展開 $? 和 $result。
提交後,在同一實例上開啟 互動式 app shell 並檢查檔案:
cat /home/LogFiles/diagnostics-<run-id>.log
cat /home/LogFiles/diagnostics-<run-id>.exit
記錄的退出狀態 0 表示診斷指令成功。 非零狀態表示失敗;檢查日誌。 如果狀態檔不存在,表示尚未完成:指令可能仍在執行、未啟動,或是被中斷。 不要從已接受狀態或部分紀錄的存在來推斷成功。 使用全新執行識別碼,避免舊狀態檔與當前結果混淆。
CLI 不提供用於輪詢完成狀態的 API。 將輸出重定向到檔案並不會自動讓它在 App Service 日誌串流中被提供。
對於資料庫遷移或其他改變共享狀態的操作,請選擇 一個 實例,分別檢查完成度,且不要因為提交沒有回傳任何輸出而重跑該操作。 在需要先驗證成功再繼續時,保持互動式工作流程。
在多個實例上執行獨立指令
執行模式也接受以逗號分隔的執行個體 ID 清單或 --instance all。 多個實例的請求會同時提交。 例如,對每個實例執行已部署的每個實例診斷指令碼:
az webapp exec --resource-group <resource-group-name> --name <app-name> --mode execute --command "python3 /home/site/wwwroot/scripts/diagnostics.py" --instance all
腳本必須擷取其自身的結果。 如果是共用的儲存空間,請使用不同的每個實例和每個執行的輸出路徑。 不要使用 all 進行共用資料庫遷移或其他只能執行一次的操作。 若部分提交失敗,CLI 會報告錯誤,儘管其他實例可能已接受該指令。
加上 --slot <slot-name> 以針對部署位置執行。
Limitations
- 執行模式只針對主要的應用程式容器。 你只能在互動式 shell 模式中使用
--target kudu。 - 僅在執行模式下使用
--working-directory或--cwd,並提供絕對路徑。 - 提供一條
--shell的絕對路徑。 在執行模式下,你只能用它搭配--shell-command。 - 此預覽版不提供檔案傳輸、埠轉發或選擇任意側車容器的選項。 使用支援的 部署方法 上傳檔案。
- 分離執行並不是具持久性的工作排程器。 容器重新啟動或更換可能會中斷工作。 不要假設會自動重試,或能保證恰好一次執行。
控制 SSH 存取
透過將應用程式的 sshEnabled 設定屬性設為 false,來停用不需要 SSH 存取的應用程式上的 SSH 存取。 以下範例使用 Bash JSON 引用:
az webapp config set --resource-group <resource-group-name> --name <app-name> \
--generic-configurations '{"sshEnabled": false}'
要重新啟用 SSH 存取:
az webapp config set --resource-group <resource-group-name> --name <app-name> \
--generic-configurations '{"sshEnabled": true}'
檢查配置:
az webapp config show --resource-group <resource-group-name> --name <app-name> --query sshEnabled
新增 --slot <slot-name> 以設定或檢查部署插槽。
在應用程式與部署位置間的治理,請使用 App Service 應用程式應關閉 SSH 和 App Service 應用程式部署位置應關閉 SSH 內建原則。 請參閱App Service 原則參考以取得指派連結。
這兩種政策都預設為 Audit,也支援 Deny 和 Disabled。 他們會將缺失或不為 false 的 sshEnabled 值評定為不合規。 稽核會回報不合規;但它不會停用 SSH。 Deny 會防止不合規的資源變更;它不會自動重新設定現有應用程式。 你可以在訂閱或管理群組範圍內指派政策,包括用於整個租戶治理的租戶根管理群組。
SSH 設定和政策合規不能取代保護對 SCM/Kudu 的存取。 請使用適當的 RBAC 權限 與 網路存取限制。
排除容器存取問題
- 確認應用程式成功啟動。 檢查啟動失敗的 診斷日誌 。
- 若要存取 CLI,請檢查 CLI 版本、所選應用程式、插槽與實例,以及是否存在所請求的執行檔或 shell。
- 確認您具有授權與 SCM 端點的網路連線。 你不需要啟用基本發佈認證;當 SCM 基本認證被關閉時,CLI 支援 Microsoft Entra 認證。 請參見 「停用基本認證」。
- 你在容器內部所做的更改,並不能取代更新和重新部署應用程式或映像檔。 容器重啟可以移除持久儲存以外的檔案。