Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
App Service 提供对运行中的应用容器的认证访问,用于故障排除和管理任务。 将容器访问视为特权操作,只向有需要的用户授予访问权限。
App Service 提供基于浏览器的 SSH 访问,访问托管在 Windows 自定义容器中的应用。 浏览器会话无需特殊图像配置。
Azure CLI az webapp exec 命令仅支持 Linux Web 应用。 不要在 Windows 应用 Service 计划中使用本文中的 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。 没有 Shell 的镜像(包括 distroless 镜像)无法打开交互式会话。
Prerequisites
- 应用和它的容器都在运行。
- 你被授权访问该应用的SCM/Kudu网站。 有关权限,请参见 访问Kudu所需的RBAC权限。
- 你的客户端拥有SCM端点的网络访问权限。 如果无法连接,请检查应用的 访问限制 和私有网络配置。
在浏览器中打开 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 中。 它向一个实例提交只读诊断命令,并分别记录其输出和退出状态。 将每次调用中的 <run-id> 替换为新的标识符,并将 <instance-id> 替换为来自 az webapp list-instances 的 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访问
通过将不需要 SSH 访问的应用的 sshEnabled 配置属性设置为 false,禁用 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 策略参考以查看分配链接。
两种策略默认采用Deny,并且也支持Disabled和Audit。 他们会将缺失或不为 false 的 sshEnabled 值评为不合规。 审计会报告不合规;但它不会禁用SSH。 Deny 可防止对不合规资源的更改;它不会自动重新配置现有应用。 你可以在订阅或管理组范围内分配策略,包括用于租户范围治理的租户根管理组。
SSH配置和策略合规不能替代对SCM/Kudu访问的安全防护。 请使用适当的 RBAC权限 和 网络访问限制。
排查容器访问问题
- 确认应用成功启动。 查看启动失败的 诊断日志 。
- 对于CLI访问,请检查CLI版本、所选应用、插槽和实例,以及请求的可执行文件或shell是否存在。
- 检查对 SCM 端点的授权和网络连接。 你不需要启用基础发布认证;当 SCM 基本认证被禁用时,CLI 支持 Microsoft Entra 认证。 参见 关闭基本身份验证。
- 你在容器内部做的更改不能替代更新和重新部署应用或镜像。 容器重启可以移除持久存储之外的文件。