使用“运行命令”操作在 Linux VM 中运行脚本

适用于:✔️ Linux VM ✔️ 灵活规模集

“运行命令”功能使用虚拟机 (VM) 代理在 Azure Linux VM 中运行 shell 脚本。 可以使用这些脚本进行常规计算机或应用程序管理。 它们可以帮助你快速诊断和修正 VM 访问与网络问题,使 VM 恢复正常状态。

优点

可通过多种方式访问虚拟机。 “运行命令”可以使用 VM 代理在虚拟机上以远程方式运行脚本。 对于 Linux VM,可以通过 Azure 门户、REST APIAzure CLI 使用“运行命令”。

在需要在虚拟机中运行脚本的所有方案中,此功能都很有用。 它可以用来对由于网络或管理用户配置不正确而没有打开 RDP 或 SSH 端口的虚拟机进行故障排除和修正,是具有此用途的少数方法之一。

先决条件

支持的 Linux 发行版

Linux 发行版 x64 ARM64
Alma Linux 9.x+ 9.x+
Debian 10+ 11.x+
Azure Linux 2.x 2.x
OpenSUSE 12.3+ 不支持
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 分钟。 90 分钟后脚本将会超时。
  • 需要从 VM 建立出站连接才能返回脚本的结果。

注意

若要正常工作,“运行命令”需要连接(通过端口 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

已知问题

Linux 操作运行命令日志与操作运行命令 Windows 日志之间存在一些显著差异:

  • 日志中的每一行以“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

注意

再次应用运行命令时,扩展将自动安装。 可以使用扩展删除命令来排查与扩展相关的任何问题。

后续步骤

若要了解以远程方式在 VM 中运行脚本和命令的其他方式,请参阅在 Linux VM 中运行脚本