
ArcGIS-Enterprise-Geoprozessierungsdienst, der eine Python-Toolbox zur Befehlsausführung veröffentlicht.
Dieses Repository enthält eine ArcGIS-Geoprocessing-Service-Definition, die eine Python-Toolbox als Task zur Befehlsausführung veröffentlicht. Sie ist für autorisierte Sicherheitstests gedacht.
Veröffentlichen oder verwenden Sie diesen Service nicht auf Systemen, für die Sie keine ausdrückliche Genehmigung haben. Ein Geoprocessing-Service führt serverseitigen Code unter dem Dienstkonto des ArcGIS Servers aus, sodass dieses Projekt eine web-shell-ähnliche Schnittstelle zum Host erzeugen kann.
Das Hauptartefakt ist ArcGIS_Shell, ein Python-Toolbox-Task mit einem Eingabeparameter:
command
Wenn die Aufgabe ausgeführt wird, führt der Server diesen Befehl über die Betriebssystem-Shell aus und gibt die normale Konsolenausgabe über das ArcGIS-Aufgabenergebnis zurück.
Das Repository enthält zwei vorgefertigte ArcGIS-Service-Definitionsdateien:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
Es enthält außerdem extrahierte Service-Definition-Ordner:
ArcGIS_Shell_10.9.1_and_earlier/
ArcGIS_Shell_11_or_later/
Diese Ordner enthalten die Dateien, die ArcGIS in die .sd-Archive packt, einschließlich der eingebetteten ArcGIS_Shell.pyt-Dateien. Bearbeiten Sie die extrahierten Ordner, wenn Sie die Service-Definition ändern, und erstellen Sie anschließend die .sd-Dateien mit package_sd.py neu.
Eine ArcGIS-Service-Definition (.sd) ist ein paketiertes Deployment-Artefakt. Sie enthält Service-Metadaten, Konfiguration, Toolbox- oder Kartenressourcen sowie unterstützende Dateien, die ArcGIS Server zum Veröffentlichen eines Services benötigt.
In diesem Repo ist jede .sd ein 7-Zip-Archiv mit ArcGIS-kompatiblen Kompressionseinstellungen:
-ms=off
-m0=LZMA:d=14
Die beiden Service-Definition-Ordner unterscheiden sich hauptsächlich durch die ArcGIS-Paketierungsversion:
10.9.1 and earlier: p20 paths, offlineSDVersion10x, ArcGIS 2.9 schema
11 or later: p30 paths, offlineSDVersion11, ArcGIS 3.1 schema
Die eingebettete Python-Toolbox-Logik ist in beiden Fällen identisch.
ArcGIS-Geoprocessing-Services werden normalerweise verwendet, um GIS-Analyse-Workflows über HTTP bereitzustellen. Ein typischer Workflow ist:
Legitime Beispiele sind das Zuschneiden von Features, die Durchführung von Netzwerkanalysen, die Verarbeitung von Rastern, die Erstellung von Berichten und die Durchführung von Batch-GIS-Transformationen.
Die wichtige Sicherheitseigenschaft besteht darin, dass Geoprocessing-Tasks serverseitig Python ausführen. Wenn ein veröffentlichter Task benutzergesteuerte Eingaben akzeptiert und sie an gefährliche Primitive wie subprocess.run(..., shell=True) weitergibt, wird der Geoprocessing-Task zu einer Schnittstelle für Befehlsausführung. Genau das demonstriert dieses Projekt.
Der Task Shell akzeptiert einen String-Parameter namens command. Die Python-Toolbox führt diesen Befehl auf dem ArcGIS-Server-Host aus und gibt stdout/stderr im Task-Ergebnis zurück.
Das bedeutet, dass ein Operator mit der Berechtigung, ArcGIS-Geoprocessing-Services zu veröffentlichen oder zu verwalten, über normale ArcGIS-Funktionalität einen web-shell-ähnlichen Service erstellen kann. Der Befehl wird im Sicherheitskontext des ArcGIS-Server-Prozesskontos ausgeführt.
Der Service aktiviert außerdem die ArcGIS-Uploads-Funktion. Dadurch werden die Upload-Endpunkte des Service bereitgestellt:
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
Uploads werden von ArcGIS Server im Systemverzeichnis der Site gespeichert, typischerweise unter einem Pfad wie:
<arcgisserver>/directories/arcgissystem/arcgisuploads/<itemID>
Der genaue Pfad hängt von der Konfiguration des ArcGIS-Server-Verzeichnisses ab. Administratoren können hochgeladene Elemente einsehen über:
https://<server>/arcgis/admin/uploads?f=pjson
Bearbeiten oder löschen Sie keine Dateien in arcgissystem manuell. Löschen Sie Upload-Elemente über REST oder das Administrator Directory.
Verwenden Sie die .sd-Datei, die zur Zielversion von ArcGIS passt:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
Typischer Server-Manager-Ablauf:
ArcGIS Server Manager öffnen:
https://<server>/arcgis/manager
Melden Sie sich mit einem Konto an, das berechtigt ist, Dienste zu veröffentlichen. Dies umfasst in der Regel portaladmin.
Navigieren Sie zu Services.
Klicken Sie auf Publish Service.
Laden Sie die passende .sd-Datei für die ArcGIS-Version hoch. Klicken Sie auf Next.
Auf der Seite „Specify properties for your new service" ändern Sie bei Bedarf den Dienstnamen. Klicken Sie auf Next.
Auf der Seite „Share your services with" müssen Sie keine Kontrollkästchen aktivieren. Klicken Sie auf Publish.
Der Dienst startet automatisch. Klicken Sie auf den Dienstnamen, dann auf Capabilities und anschließend auf die REST URL.
Um den Dienst zu löschen, klicken Sie auf das „X" neben dem Dienstnamen.
Die vorgefertigten .sd-Dateien enthalten bereits:
"capabilities": "Uploads"
Sie enthalten außerdem umfassende Upload-Einstellungen zum Testen:
"maxUploadFileSize": "2048",
"allowedUploadFileTypes": "<broad explicit extension list>"
maxUploadFileSize wird in MB angegeben. Die Erweiterungsliste ist für Assessment-Arbeiten bewusst breit gefasst, sie bleibt jedoch eine explizite Allowlist und kein echtes „alles erlauben“-Wildcard.
Öffnen Sie nach dem Veröffentlichen den Dienst im ArcGIS REST Services Directory:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer
Wenn der Dienst in einem Ordner veröffentlicht wird, geben Sie den Ordnernamen an:
https://<server>/arcgis/rest/services/<folder>/ArcGIS_Shell/GPServer
Öffnen Sie die Aufgabe:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/Shell
Klicken Sie auf Execute Task.
Legen Sie Ihren Befehl fest und senden Sie das Formular ab. Das Aufgabenergebnis sollte die Befehlsausgabe enthalten.
Die Ausgabe ist im JSON-Format, daher sind Zeilenumbrüche maskiert (\r\n). Sie müssen mehrzeilige Ausgaben nachbearbeiten.
Da die Aufgabe die Betriebssystem-Shell verwendet, funktionieren Shell-Built-ins:
dir
echo test
whoami /groups
Auf Linux-Zielen verwenden Sie Linux-Befehle:
id
uname -a
pwd
Öffnen Sie die Uploads-Ressource:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
Klicken Sie auf Upload Item, oder gehen Sie direkt zu:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
Die REST-Web-GUI sollte eine Dateiauswahl anzeigen, wenn Uploads aktiviert sind.
Verwenden Sie das Formular, um eine Datei auszuwählen und den Upload abzusenden. Die Antwort enthält eine itemID.
Prüfen Sie das hochgeladene Element mit:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>
Löschen Sie das hochgeladene Element mit:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>/delete
Verwenden Sie das REST-Webformular auf dieser Seite, um den Löschvorgang zu übermitteln.