Open een container shell (SSH) en voer commando's uit in Azure App Service

App Service biedt geauthenticeerde toegang tot draaiende app-containers voor probleemoplossing en administratieve taken. Behandel containertoegang als een bevoorrechte operatie en verleen alleen toegang aan gebruikers die het nodig hebben.

App Service biedt browsergebaseerde SSH-toegang tot apps die worden gehost in aangepaste Windows-containers. Voor de browsersessie is geen speciale afbeeldingsconfiguratie vereist.

Het Azure CLI-commando az webapp exec wordt alleen ondersteund voor Linux-webapps. Gebruik de voorbeelden van Linux CLI in dit artikel niet voor Windows-app Service-plannen.

Voor ingebouwde en aangepaste Linux-containers gebruiken de nieuwere browserterminal en az webapp exec Kudu als geauthenticeerde proxy om verbinding te maken met de draaiende container. Deze opties vereisen niet dat je een SSH-server installeert, een SSH-wachtwoord insluit, een SSH-poort blootstelt of een SSH-daemon in je aangepaste image start. Legacy Kudu WebSSH en az webapp ssh-toegang vereisen mogelijk nog steeds een SSH-server in een aangepaste afbeelding.

Gebruik het Azure-portaal voor een browsersessie, of gebruik de previewopdracht az webapp exec voor een lokale terminalsessie of losgekoppelde uitvoering van opdrachten. De browserterminal vereist /bin/bash in de afbeelding en ondersteunt momenteel geen andere shell. Als het beeld een andere shell heeft, gebruik az webapp exec --shell /bin/sh dan in plaats daarvan. Images zonder shell, inclusief distroless images, kunnen geen interactieve sessie openen.

Prerequisites

  • Voor de CLI-voorbeelden: installeer Azure CLI 2.90.0 of later en log in. Controleer uw versie met az version. Je kunt ook Azure Cloud Shell gebruiken als de CLI aan deze eis voldoet.
  • Voor een interactieve CLI-sessie gebruik je een interactieve terminal en een shell die in je image aanwezig is. De standaard is /bin/bash; voor een image zonder bash, specificeer --shell /bin/sh als die shell beschikbaar is.

SSH-sessie in de browser openen

Je app en de bijbehorende container moeten draaien voordat je een browsersessie opent.

Open in het Azure-portaal je App Service-app. Selecteer onder Development Tools de optie SSH en vervolgens Go. Log in met je Azure-account als daarom wordt gevraagd.

De sessie opent in je browser, waar je commando's kunt uitvoeren binnen de app-container.

SSH-verbinding

SSH-sessie openen met Azure CLI

Het preview-commando az webapp exec opent een interactieve shell in de hoofdcontainer van je app. De sessie gebruikt je lokale terminal op Windows, macOS en Linux; het opent geen browser.

az webapp exec --resource-group <resource-group-name> --name <app-name>

Voor een afbeelding die /bin/sh gebruikt in plaats van bash:

az webapp exec --resource-group <resource-group-name> --name <app-name> --shell /bin/sh

Je kunt commando's uitvoeren en hun output in deze sessie inspecteren. Gebruik bijvoorbeeld top als het in de image is geïnstalleerd. Om de SCM/Kudu-container te inspecteren in plaats van de app-container:

az webapp exec --resource-group <resource-group-name> --name <app-name> --target kudu

De app en Kudu-containers zijn verschillende omgevingen. Voer commando's uit die afhankelijk zijn van de runtime, afhankelijkheden of netwerkconnectiviteit van je app in de appcontainer.

Selecteer een instantie of deployment slot

Standaard maakt de CLI verbinding met één app-instantie. Om instantie-ID's te vinden:

az webapp list-instances --resource-group <resource-group-name> --name <app-name> --output table

Om verbinding te maken met een specifieke instantie:

az webapp exec --resource-group <resource-group-name> --name <app-name> --instance <instance-id>

Voeg --slot <slot-name> toe om toegang te krijgen tot een deploymentslot. Voeg bij het selecteren van een slot-instantie ook --slot toe aan az webapp list-instances.

Interactieve shellmodus ondersteunt slechts één instantie tegelijk.

Voer commando's uit zonder een interactieve sessie

Gebruik --mode execute om een commando in de hoofd-appcontainer te sturen zonder een terminalsessie te openen. Het commando wordt ontkoppeld uitgevoerd. Deze modus is handig voor achtergronddiagnostiek of ander werk dat geen directe output vereist.

Important

Execute mode is fire-and-forget. Een resultaat met status accepted bevestigt alleen dat het verzoek is geaccepteerd, niet dat het commando is uitgevoerd, voltooid of geslaagd. De CLI geeft niet de standaard output, standaard fout of exitcode van het externe commando terug. Een mislukte indiening veroorzaakt een CLI-fout, maar een succesvolle CLI-aanroep is geen bewijs van succesvolle remote uitvoering. Gebruik een interactieve shell wanneer je het resultaat direct wilt zien.

Voer een programma direct uit

Gebruik --command om een programma en zijn argumenten te specificeren. Citeer het hele commando:

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>

Vervang het scriptpad door een script dat in je app is geïmplementeerd. Het uitvoerbare bestand en zijn afhankelijkheden moeten in de container aanwezig zijn.

--command interpreteert geen shell-operatoren zoals >, |, of &&. Gebruik in plaats daarvan --shell-command als je een shell nodig hebt. Deze twee opties sluiten elkaar uit.

Leg uitvoer vast en controleer voltooiing

Het volgende voorbeeld gebruikt Bash-clientquotering, zoals in Cloud Shell. Het dient een alleen-lezen diagnostisch commando in bij één instantie en registreert de output- en exitstatus apart. Vervang <run-id> door een nieuwe identifier voor elke aanroep en <instance-id> door een ID uit az webapp list-instances.

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'

Zorg ervoor dat /bin/sh en het diagnostische commando bestaan, en dat /home/LogFiles bestaat en schrijfbaar is. De persistentie van /home in aangepaste containers hangt af van de opslagconfiguratie van de app. De enkele quotes voorkomen dat de cliëntshell $? en $result expandeert voordat het verzoek de container bereikt.

Na het indienen open je een interactieve appshell op dezelfde instantie en inspecteer je de bestanden:

cat /home/LogFiles/diagnostics-<run-id>.log
cat /home/LogFiles/diagnostics-<run-id>.exit

Een geregistreerde exitstatus van 0 geeft aan dat het diagnostische commando is geslaagd. Een niet-nul status duidt op een falen; inspecteer het logboek. Als het statusbestand niet bestaat, is de voltooiing nog niet vastgesteld: het commando kan nog steeds draaien, niet gestart zijn, of onderbroken zijn. Leid succes niet af van acceptatie of van de aanwezigheid van een gedeeltelijk logboek. Gebruik een verse run identifier zodat een ouder statusbestand niet verward kan worden met het huidige resultaat.

De CLI biedt geen API voor completion polling. Het omleiden van output naar een bestand maakt het niet automatisch beschikbaar in App Service log streaming.

Voor databasemigraties of andere bewerkingen die de gedeelde status wijzigen, selecteer één instantie, controleer de voltooiing apart en voer de bewerking niet opnieuw uit alleen omdat de uitvoering geen output teruggaf. Houd de interactieve workflow aan wanneer je succes moet verifiëren voordat je verder gaat.

Voer onafhankelijke commando's uit op meerdere instanties

Uitvoermodus accepteert ook een komma-gescheiden lijst van instantie-ID's of --instance all. Verzoeken voor meerdere exemplaren worden parallel ingediend. Voer bijvoorbeeld een geïmplementeerd diagnostisch script per instantie uit op elke instantie:

az webapp exec --resource-group <resource-group-name> --name <app-name> --mode execute --command "python3 /home/site/wwwroot/scripts/diagnostics.py" --instance all

Het script moet zijn eigen resultaten vastleggen. Gebruik verschillende uitvoerpaden per instance en per run als opslag gedeeld wordt. Gebruik all niet voor gedeelde databasemigraties of andere bewerkingen die slechts één keer moeten draaien. Als sommige inzendingen mislukken, rapporteert de CLI een fout, ook al hebben andere exemplaren het commando mogelijk geaccepteerd.

Voeg --slot <slot-name> toe om uit te voeren op een implementatieslot.

Limitations

  • Uitvoermodus is alleen van toepassing op de hoofd-appcontainer. Je kunt --target kudu alleen gebruiken in interactieve shell-modus.
  • Gebruik --working-directory of --cwd alleen in uitvoermodus, en geef een absoluut pad.
  • Geef een absoluut pad voor --shell. In execute-modus kun je het alleen gebruiken met --shell-command.
  • Deze preview biedt geen bestandsoverdracht, port forwarding of de optie om willekeurige sidecar-containers te selecteren. Gebruik ondersteunde deploymentmethoden om bestanden te uploaden.
  • Detached execution is geen duurzame job scheduler. Een herstart of vervanging van een container kan het werk onderbreken. Ga er niet van uit dat automatische nieuwe pogingen plaatsvinden of precies één keer wordt uitgevoerd.

Beheer SSH-toegang

Schakel SSH-toegang uit op apps die het niet nodig hebben door de sshEnabled configuratie-eigenschap van de app in te stellen op false. De volgende voorbeelden gebruiken aanhalingstekens voor JSON in Bash:

az webapp config set --resource-group <resource-group-name> --name <app-name> \
  --generic-configurations '{"sshEnabled": false}'

Om SSH-toegang opnieuw in te schakelen:

az webapp config set --resource-group <resource-group-name> --name <app-name> \
  --generic-configurations '{"sshEnabled": true}'

Om de configuratie te inspecteren:

az webapp config show --resource-group <resource-group-name> --name <app-name> --query sshEnabled

--slot <slot-name> toevoegen om een deploymentslot te configureren of te inspecteren.

Gebruik voor governance voor apps en slots het ingebouwde beleid App Service-apps moeten SSH uitschakelen en App Service-app-slots moeten SSH uitschakelen. Zie de App Service-beleidsreferentie voor toewijzingslinks.

Beide beleidsregels zijn standaard op Audit en ondersteunen Deny ook en Disabled. Ze beoordelen een afwezige of niet-valse sshEnabled waarde als niet-conform. Audit meldt niet-naleving; het schakelt SSH niet uit. Deny voorkomt wijzigingen in niet-conforme resources; het herconfigureert bestaande apps niet automatisch. Je kunt beleid toewijzen op abonnements- of managementgroep-scope, inclusief de tenant root management group voor tenant-brede governance.

SSH-configuratie en beleidsnaleving zijn geen vervanging voor het beveiligen van toegang tot SCM/Kudu. Gebruik de juiste RBAC-rechten en netwerktoegangsbeperkingen.

Problemen met containertoegang oplossen

  • Bevestig dat de app succesvol is opgestart. Bekijk diagnostische logboeken voor opstartfouten.
  • Voor CLI-toegang controleer de CLI-versie, de geselecteerde app, slot en instantie, en of het gevraagde uitvoerbare bestand of de shell bestaat.
  • Controleer autorisatie en netwerkconnectiviteit met het SCM-eindpunt. Je hoeft geen basisauthenticatie voor publicaties in te schakelen; de CLI ondersteunt Microsoft Entra-authenticatie wanneer SCM-basisauthenticatie is uitgeschakeld. Zie Basisauthenticatie uitschakelen.
  • Wijzigingen die je in de container aanbrengt vervangen niet het updaten en opnieuw uitrollen van de app of image. De herstart van de container kan bestanden buiten de persistente opslag verwijderen.