共用方式為


使用動作執行命令在 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 的下列步驟:

使用下列移除範例中的相關資源群組名稱和虛擬器機名稱取代 rgnamevmname

 Invoke-AzVMRunCommand -ResourceGroupName 'rgname' -VMName 'vmname' -CommandId 'RemoveRunCommandLinuxExtension'
az vm run-command invoke  --command-id RemoveRunCommandLinuxExtension --name vmname -g rgname

注意

當您再次套用執行命令時,會自動安裝延伸模組。 您可以使用延伸模組移除命令,針對與延伸模組相關的任何問題進行疑難排解。

下一步

請參閱在 Linux VM 中執行指令碼,了解如何以其他方式從遠端在 VM 中執行指令碼和命令。