使用“运行命令”操作在 Linux VM 中运行脚本
适用于:✔️ Linux VM ✔️ 灵活规模集
“运行命令”功能使用虚拟机 (VM) 代理在 Azure Linux VM 中运行 shell 脚本。 可以使用这些脚本进行常规计算机或应用程序管理。 它们可以帮助你快速诊断和修正 VM 访问与网络问题,使 VM 恢复正常状态。
优点
可通过多种方式访问虚拟机。 “运行命令”可以使用 VM 代理在虚拟机上以远程方式运行脚本。 对于 Linux VM,可以通过 Azure 门户、REST API 或 Azure 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 中运行脚本。