使用動作執行命令在 Linux VM 中執行指令碼
適用於:✔️ Linux VM ✔️ 彈性擴展集
執行命令功能會使用虛擬機器 (VM) 代理程式在 Azure Linux VM 中執行 Shell 指令碼。 您可以使用這些指令碼,進行一般電腦或應用程式管理。 這些指令碼能協助快速診斷和修復 VM 存取與網路問題,並讓 VM 恢復正常狀態。
福利
您有多種方式可存取虛擬機器。 執行命令可使用 VM 代理程式,從遠端在虛擬機器上執行指令碼。 您可透過 Azure 入口網站、REST API 或適用於 Linux VM 的 Azure CLI來使用 [執行] 命令。
當想要在虛擬機器中執行指令碼時,任何情況都適用這項功能。 這是唯一能夠疑難排解和修復因網路或管理使用者設定,而未開啟 RDP 或 SSH 連接埠的虛擬機器方法。
必要條件
支援的 Linux 發行版本
Linux 發行版本 | x64 | ARM64 |
---|---|---|
Alma Linux | 9.x+ | 9.x+ |
Debian | 10+ | 11.x+ |
Flatcar Linux | 3374.2.x+ | 3374.2.x+ |
Azure Linux | 2.x | 2.x |
openSUSE | 12.3+ | 不支援 |
Oracle Linux | 6.4+、7.x+、8.x+ | 不支援 |
Red Hat Enterprise Linux | 6.7+、7.x+、8.x+ | 8.6+、9.0+ |
Rocky Linux | 9.x+ | 9.x+ |
SLES | 12.x+、15.x+ | 15.x SP4+ |
Ubuntu | 18.04+、20.04+、22.04+ | 20.04+、22.04+ |
限制
當您使用執行命令時,有下列限制:
- 輸出僅限於最後 4,096 個位元組。
- 執行指令碼的最短時間是大約 20 秒。
- 根據預設,執行指令碼的身分為 Linux 上提高權限的使用者。
- 您一次只能執行一個指令碼。
- 不支援提示資訊 (互動模式) 的指令碼。
- 您無法取消執行中的指令碼。
- 指令碼可以執行的最長時間是 90 分鐘。 指令碼會在這個時間之後逾時。
- 需要有虛擬機器的輸出連線,才能傳回指令碼結果。
注意
為正常運作,執行命令需要能夠連線 (連接埠 443) 至 Azure 公用 IP 位址。 如果延伸模組不具有這些端點的存取權,指令碼可能會成功執行,但無法傳回結果。 如果要封鎖虛擬機器上的流量,您可使用服務標籤,以利用 AzureCloud
標籤允許送往 Azure 公用 IP 位址的流量。
可用的命令
下表顯示 Linux VM 的可用命令清單。 您可使用 RunShellScript 命令執行想要的任何自訂指令碼。 當使用 Azure CLI 或 PowerShell 執行命令時,您為 --command-id
或 -CommandId
參數所提供值必須是下列值的其中之一。 如果您指定的值不是可用命令,就會收到此錯誤:
The entity was not found in this Azure location
名稱 | 說明 |
---|---|
RunShellScript | 執行 Linux Shell 指令碼。 |
ifconfig | 取得所有網路介面的設定。 |
Azure CLI
下列範例使用 az vm run-command 命令來在 Azure Linux VM 上執行 Shell 指令碼。
az vm run-command invoke -g myResourceGroup -n myVm --command-id RunShellScript --scripts "apt-get update && apt-get install -y nginx"
注意
若要以不同的使用者身分執行命令,請輸入 sudo -u
以指定使用者帳戶。
Azure 入口網站
前往 Azure 入口網站中的 VM,並在 [作業] 下,選取左側功能表中的 [執行命令]。 您會看到可在 VM 上執行的可用命令清單。
選擇要執行的命令。 有些命令可能有選擇性或必要的輸入參數。 對於這些命令,參數會顯示為文字欄位,以供提供輸入值。 您可展開 [檢視指令碼] 來檢視每個命令正在執行的指令碼。 RunShellScript 不同於其他命令,因為其可供提供自己的自訂指令碼。
注意
內建命令是無法編輯的。
選擇命令之後,請選取 [執行] 以執行指令碼。 指令碼完成後,其會在輸出視窗中傳回輸出和所有錯誤。 下列螢幕擷取畫面顯示執行 ifconfig 命令的範例輸出。
PowerShell
下列範例使用 Invoke-AzVMRunCommand Cmdlet,在 Azure VM 上執行 PowerShell 指令碼。 此 Cmdlet 預期 -ScriptPath
參數中所參考的指令碼,位於 Cmdlet 執行所在位置的本機環境。
Invoke-AzVMRunCommand -ResourceGroupName '<myResourceGroup>' -Name '<myVMName>' -CommandId 'RunShellScript' -ScriptPath '<pathToScript>' -Parameter @{"arg1" = "var1";"arg2" = "var2"}
限制於執行命令的存取
列出執行命令或顯示命令詳細資料,需要訂用帳戶層級的 Microsoft.Compute/locations/runCommands/read
權限。 內建讀者角色和具有此權限的較高層級。
執行命令需要有 Microsoft.Compute/virtualMachines/runCommands/write
權限。 虛擬機器參與者角色和具有此權限的較高層級。
您可使用其中一個內建角色或建立自訂角色,以使用 [執行] 命令。
動作執行命令 Linux 疑難解答
針對 Linux 環境的動作執行命令進行疑難解答時,請參閱處理常式記錄檔 (其通常位於下列目錄中: /var/log/azure/run-command-handler/handler.log
) 以取得進一步的詳細資料。
已知問題
相較於動作執行命令 Windows 記錄,Linux 動作執行命令命令記錄有一些顯著差異:
- 序號會以 'seq=#' 的每一行記錄來報告
- 不會有包含
Awaiting completion...
的行,因為此行只會執行命令 Windows。 - 此行
Command existed with code: #
也只會出現在動作執行命令 Windows 記錄中。
動作執行命令移除
如果您需要移除動作執行命令 Linux 延伸模組,請參閱 Azure PowerShell 和 CLI 的下列步驟:
使用下列移除範例中的相關資源群組名稱和虛擬器機名稱取代 rgname 和 vmname。
Invoke-AzVMRunCommand -ResourceGroupName 'rgname' -VMName 'vmname' -CommandId 'RemoveRunCommandLinuxExtension'
az vm run-command invoke --command-id RemoveRunCommandLinuxExtension --name vmname -g rgname
注意
當您再次套用執行命令時,會自動安裝延伸模組。 您可以使用延伸模組移除命令,針對與延伸模組相關的任何問題進行疑難排解。
下一步
請參閱在 Linux VM 中執行指令碼,了解如何以其他方式從遠端在 VM 中執行指令碼和命令。