{"id":72737,"date":"2025-03-04T07:35:03","date_gmt":"2025-03-04T06:35:03","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=72737&#038;preview=true&#038;preview_id=72737"},"modified":"2025-03-04T08:35:45","modified_gmt":"2025-03-04T07:35:45","slug":"shell-skripte-kinsta-api","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/","title":{"rendered":"Deine WordPress-Seiten mit Shell-Skripten und Kinsta API verwalten"},"content":{"rendered":"<p>Wenn du viele WordPress-Seiten verwaltest, bist du wahrscheinlich immer auf der Suche nach M\u00f6glichkeiten, deine Arbeitsabl\u00e4ufe zu vereinfachen und zu beschleunigen.<\/p>\n<p>Stell dir Folgendes vor: Mit einem einzigen Befehl in deinem <a href=\"https:\/\/kinsta.com\/de\/blog\/wp-cli\/\">Terminal<\/a> kannst du manuelle Backups f\u00fcr alle deine Websites durchf\u00fchren, selbst wenn du Dutzende davon verwaltest. Das ist die St\u00e4rke der Kombination von Shell-Skripten und der <a href=\"https:\/\/kinsta.com\/de\/docs\/kinsta-api\/\">Kinsta-API<\/a>.<\/p>\n<p>In diesem Leitfaden lernst du, wie du mit Shell-Skripten benutzerdefinierte Befehle einrichten kannst, die die Verwaltung deiner Websites effizienter machen.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Voraussetzungen<\/h2>\n<p>Bevor wir beginnen, brauchst du Folgendes:<\/p>\n<ol start=\"1\">\n<li><strong>Ein Terminal<\/strong>: Alle modernen Betriebssysteme werden mit einer Terminal-Software ausgeliefert, so dass du sofort mit der Skripterstellung beginnen kannst.<\/li>\n<li><strong>Eine IDE oder einen Texteditor<\/strong>: Verwende ein Tool, mit dem du gut zurechtkommst, z. B. VS Code, Sublime Text oder sogar einen leichtgewichtigen Editor wie Nano f\u00fcr schnelle Terminal-Editierungen.<\/li>\n<li><strong>Ein Kinsta-API-Schl\u00fcssel<\/strong>: Er ist wichtig, um mit der <a href=\"https:\/\/api-docs.kinsta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Kinsta-API<\/a> zu interagieren. So generierst du ihn:\n<ul>\n<li>Logge dich in dein <a href=\"https:\/\/my.kinsta.com\/login\/?lang=de\" target=\"_blank\" rel=\"noopener noreferrer\">MyKinsta-Dashboard<\/a> ein.<\/li>\n<li>Gehe zu <strong>Dein Name<\/strong> &gt; <strong>Unternehmenseinstellungen<\/strong> &gt; <strong>API-Schl\u00fcssel<\/strong>.<\/li>\n<li>Klicke auf <strong>API-Schl\u00fcssel erstellen<\/strong> und speichere ihn sicher.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>curl<\/code><\/strong><strong> und <\/strong><strong><code>jq<\/code><\/strong>: Unverzichtbar f\u00fcr API-Anfragen und den Umgang mit JSON-Daten. \u00dcberpr\u00fcfe, ob sie installiert sind, oder installiere sie.<\/li>\n<li><strong>Grundlegende Programmierkenntnisse<\/strong>: Du musst kein Experte sein, aber ein Verst\u00e4ndnis f\u00fcr die Grundlagen der Programmierung und die Syntax von Shell-Skripten ist hilfreich.<\/li>\n<\/ol>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Wenn du die Kinsta-API noch nicht kennst, wirst du von ihrer Vielseitigkeit \u00fcberrascht sein. Im Laufe der Jahre haben wir Leitf\u00e4den ver\u00f6ffentlicht, in denen wir einige gro\u00dfartige Anwendungsf\u00e4lle vorgestellt haben, wie z. B. den <a href=\"https:\/\/kinsta.com\/de\/blog\/erstelle-slackbot-website-management\/\">Aufbau eines Slackbots<\/a> oder die <a href=\"https:\/\/kinsta.com\/de\/blog\/massenaktualisierung-von-plugins-wordpress\/\">Erstellung einer benutzerdefinierten Benutzeroberfl\u00e4che<\/a> zur Automatisierung von Aufgaben wie der Aktualisierung von Plugins auf mehreren Websites. Die API befindet sich zwar noch in der \u00f6ffentlichen Beta-Phase, bietet aber schon jetzt eine Vielzahl von Endpunkten. Schau dir die <a href=\"https:\/\/kinsta.com\/de\/docs\/kinsta-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">Dokumentation<\/a> an, um zu sehen, was alles m\u00f6glich ist.<\/p>\n<\/aside>\n\n<h2>Dein erstes Skript schreiben<\/h2>\n<p>Dein erstes Shell-Skript zu erstellen, um mit der Kinsta-API zu interagieren, ist einfacher, als du vielleicht denkst. Beginnen wir mit einem einfachen Skript, das alle WordPress-Seiten auflistet, die unter deinem Kinsta-Konto verwaltet werden.<\/p>\n<h3>Schritt 1: Richte deine Umgebung ein<\/h3>\n<p>Beginne damit, einen Ordner f\u00fcr dein Projekt und eine neue Skriptdatei zu erstellen. Die Erweiterung <code>.sh<\/code> wird f\u00fcr Shell-Skripte verwendet. Du kannst zum Beispiel einen Ordner erstellen, zu ihm navigieren und mit diesen Befehlen eine Skriptdatei in VS Code erstellen und \u00f6ffnen:<\/p>\n<pre><code class=\"language-bash\">mkdir my-first-shell-scripts\ncd my-first-shell-scripts\ntouch script.sh\ncode script.sh<\/code><\/pre>\n<h3>Schritt 2: Definiere deine Umgebungsvariablen<\/h3>\n<p>Um deinen API-Schl\u00fcssel sicher zu halten, speichere ihn in einer <code>.env<\/code> Datei, anstatt ihn fest in das Skript zu kodieren. So kannst du die Datei <code>.env<\/code> zu <code>.gitignore<\/code> hinzuf\u00fcgen und verhindern, dass sie in die Versionskontrolle gelangt.<\/p>\n<p>F\u00fcge in deiner <code>.env<\/code> Datei Folgendes hinzu:<\/p>\n<pre><code class=\"language-bash\">API_KEY=your_kinsta_api_key<\/code><\/pre>\n<p>Als N\u00e4chstes ziehst du den API-Schl\u00fcssel aus der Datei <code>.env<\/code> in dein Skript, indem du oben in deinem Skript Folgendes hinzuf\u00fcgst:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\nsource .env<\/code><\/pre>\n<p>Der Shebang <code>#!\/bin\/bash<\/code> sorgt daf\u00fcr, dass das Skript mit der Bash ausgef\u00fchrt wird, w\u00e4hrend <code>source .env<\/code> die Umgebungsvariablen importiert.<\/p>\n<h3>Schritt 3: Schreibe die API-Anfrage<\/h3>\n<p>Speichere zun\u00e4chst deine <strong>Unternehmens-ID<\/strong> (zu finden in MyKinsta unter <strong>Unternehmenseinstellungen <\/strong>&gt;<strong> Rechnungsdetails<\/strong>) in einer Variablen:<\/p>\n<pre><code class=\"language-bash\">COMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>Dann f\u00fcgst du den Befehl curl hinzu, um eine GET-Anfrage an den Endpunkt <code>\/sites<\/code> zu stellen und \u00fcbergibst die Unternehmens-ID als Abfrageparameter. Verwende <a href=\"https:\/\/www.baeldung.com\/linux\/jq-command-json\" target=\"_blank\" rel=\"noopener noreferrer\">jq<\/a>, um die Ausgabe f\u00fcr die Lesbarkeit zu formatieren:<\/p>\n<pre><code class=\"language-bash\">curl -s -X GET \n  \"https:\/\/api.kinsta.com\/v2\/sites?company=$COMPANY_ID\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\" | jq<\/code><\/pre>\n<p>Mit dieser Anfrage werden Details zu allen Websites abgefragt, die mit deinem Unternehmen verbunden sind, einschlie\u00dflich ihrer IDs, Namen und Status.<\/p>\n<h3>Schritt 4: Mache das Skript ausf\u00fchrbar<\/h3>\n<p>Speichere das Skript und mache es ausf\u00fchrbar, indem du es ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">chmod +x script.sh<\/code><\/pre>\n<h3>Schritt 5: F\u00fchre das Skript aus<\/h3>\n<p>F\u00fchre das Skript aus, um eine formatierte Liste deiner Websites zu sehen:<\/p>\n<pre><code class=\"language-bash\">.\/list_sites.sh<\/code><\/pre>\n<p>Wenn du das Skript ausf\u00fchrst, erh\u00e4ltst du eine \u00e4hnliche Antwort wie diese:<\/p>\n<pre><code class=\"language-bash\">{\n  \"company\": {\n    \"sites\": [\n      {\n        \"id\": \"a8f39e7e-d9cf-4bb4-9006-ddeda7d8b3af\",\n        \"name\": \"bitbuckettest\",\n        \"display_name\": \"bitbucket-test\",\n        \"status\": \"live\",\n        \"site_labels\": []\n      },\n      {\n        \"id\": \"277b92f8-4014-45f7-a4d6-caba8f9f153f\",\n        \"name\": \"duketest\",\n        \"display_name\": \"zivas Signature\",\n        \"status\": \"live\",\n        \"site_labels\": []\n      }\n    ]\n  }\n}<\/code><\/pre>\n<p>Das funktioniert zwar, aber wir k\u00f6nnen es noch verbessern, indem wir eine Funktion einrichten, die die Website-Details abruft und f\u00fcr eine bessere Lesbarkeit formatiert.<\/p>\n<h3>Schritt 6: Refactor mit einer Funktion<\/h3>\n<p>Ersetze die Anfrage <code>curl<\/code> durch eine wiederverwendbare Funktion, die die Seitenliste abruft und formatiert:<\/p>\n<pre><code class=\"language-bash\">list_sites() {\n  echo \"Fetching all sites for company ID: $COMPANY_ID...\"\n  \n  RESPONSE=$(curl -s -X GET \"https:\/\/api.kinsta.com\/v2\/sites?company=$COMPANY_ID\" \n    -H \"Authorization: Bearer $API_KEY\" \n    -H \"Content-Type: application\/json\")\n\n  # Check for errors\n  if [ -z \"$RESPONSE\" ]; then\n    echo \"Error: No response from the API.\"\n    exit 1\n  fi\n\n  echo \"Company Sites:\"\n  echo \"--------------\"\n  echo \"$RESPONSE\" | jq -r '.company.sites[] | \"(.display_name) ((.name)) - Status: (.status)\"'\n}\n\n# Run the function\nlist_sites<\/code><\/pre>\n<p>Wenn du das Skript erneut ausf\u00fchrst, erh\u00e4ltst du eine sauber formatierte Ausgabe:<\/p>\n<pre><code class=\"language-bash\">Fetching all sites for company ID: b383b4c-****-****-a47f-83999c5d2...\nCompany Sites:\n--------------\nbitbucket-test (bitbuckettest) - Status: live\nzivas Signature (duketest) - Status: live<\/code><\/pre>\n<p>Mit diesem Skript hast du den ersten Schritt getan, um Shell-Skripte und die Kinsta-API f\u00fcr die Automatisierung der WordPress-Site-Verwaltung zu nutzen. In den n\u00e4chsten Abschnitten werden wir uns mit der Erstellung fortgeschrittener Skripte befassen, die auf leistungsstarke Weise mit der API interagieren.<\/p>\n<h2>Fortgeschrittener Anwendungsfall 1: Backups erstellen<\/h2>\n<p>Das Erstellen von Backups ist ein wichtiger Aspekt der Website-Verwaltung. Sie erm\u00f6glichen es dir, deine Website im Falle unvorhergesehener Probleme wiederherzustellen. Mit der Kinsta-API und Shell-Skripten kann dieser Prozess automatisiert werden, was Zeit und M\u00fche spart.<\/p>\n<p>In diesem Abschnitt erstellen wir Backups und gehen auf die von Kinsta vorgegebene Grenze von <strong>f\u00fcnf manuellen Backups pro Umgebung<\/strong> ein. Dazu werden wir einen Prozess implementieren, um:<\/p>\n<ul>\n<li>Die aktuelle Anzahl der manuellen Backups \u00fcberpr\u00fcfen.<\/li>\n<li>das \u00e4lteste Backup zu identifizieren und zu l\u00f6schen (mit Best\u00e4tigung des Benutzers), wenn die Grenze erreicht ist.<\/li>\n<li>Ein neues Backup zu erstellen.<\/li>\n<\/ul>\n<p>Kommen wir nun zu den Details.<\/p>\n<h3>Der Backup-Workflow<\/h3>\n<p>Um Backups \u00fcber die Kinsta-API zu erstellen, verwendest du <a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">den folgenden Endpunkt<\/a>:<\/p>\n<pre><code class=\"language-bash\">POST \/sites\/environments\/{env_id}\/manual-backups<\/code><\/pre>\n<p>Dies erfordert:<\/p>\n<ol start=\"1\">\n<li><strong>Umgebungs-ID<\/strong>: Identifiziert die Umgebung (wie Staging oder Produktion), in der das Backup erstellt wird.<\/li>\n<li><strong>Backup-Tag<\/strong>: Ein Etikett zur Identifizierung des Backups (optional).<\/li>\n<\/ol>\n<p>Das manuelle Abrufen der Umgebungs-ID und das Ausf\u00fchren eines Befehls wie <code>backup &lt;environment ID&gt;<\/code> kann m\u00fchsam sein. Stattdessen erstellen wir ein benutzerfreundliches Skript, bei dem du einfach den <strong>Namen der Website<\/strong> angibst und das Skript wird:<\/p>\n<ol start=\"1\">\n<li>Die Liste der Umgebungen f\u00fcr die Seite abrufen.<\/li>\n<li>Dich auffordern, die zu sichernde Umgebung auszuw\u00e4hlen.<\/li>\n<li>den Prozess der Backup-Erstellung abwickeln.<\/li>\n<\/ol>\n<h3>Wiederverwendbare Funktionen f\u00fcr sauberen Code<\/h3>\n<p>Um unser Skript modular und wiederverwendbar zu halten, werden wir Funktionen f\u00fcr bestimmte Aufgaben definieren. Gehen wir die Einrichtung Schritt f\u00fcr Schritt durch.<\/p>\n<h4>1. Basisvariablen einrichten<\/h4>\n<p>Du kannst das erste Skript, das du erstellt hast, weglassen oder eine neue Skriptdatei daf\u00fcr erstellen. Beginne damit, die Basis-URL der Kinsta-API und deine Unternehmens-ID im Skript zu deklarieren:<\/p>\n<pre><code class=\"language-bash\">BASE_URL=\"https:\/\/api.kinsta.com\/v2\"\nCOMPANY_ID=\"&lt;your_company_id&gt;\"<\/code><\/pre>\n<p>Diese Variablen erm\u00f6glichen es dir, die API-Endpunkte dynamisch im Skript zu erstellen.<\/p>\n<h4>2. Alle Seiten abrufen<\/h4>\n<p>Definiere eine Funktion, um die Liste aller Unternehmensseiten abzurufen. So kannst du sp\u00e4ter Details zu jeder Seite abrufen.<\/p>\n<pre><code class=\"language-bash\">get_sites_list() {\n  API_URL=\"$BASE_URL\/sites?company=$COMPANY_ID\"\n\n  echo \"Fetching all sites for company ID: $COMPANY_ID...\"\n  \n  RESPONSE=$(curl -s -X GET \"$API_URL\" \n    -H \"Authorization: Bearer $API_KEY\" \n    -H \"Content-Type: application\/json\")\n\n  # Check for errors\n  if [ -z \"$RESPONSE\" ]; then\n    echo \"Error: No response from the API.\"\n    exit 1\n  fi\n\n  echo \"$RESPONSE\"\n}<\/code><\/pre>\n<p>Du wirst feststellen, dass diese Funktion eine unformatierte Antwort von der API zur\u00fcckgibt. Um eine formatierte Antwort zu erhalten. Du kannst eine weitere Funktion hinzuf\u00fcgen, die das erledigt (aber das ist nicht unser Thema in diesem Abschnitt):<\/p>\n<pre><code class=\"language-bash\">list_sites() {\n  RESPONSE=$(get_sites_list)\n\n  if [ -z \"$RESPONSE\" ]; then\n    echo \"Error: No response from the API while fetching sites.\"\n    exit 1\n  fi\n\n  echo \"Company Sites:\"\n  echo \"--------------\"\n  # Clean the RESPONSE before passing it to jq\n  CLEAN_RESPONSE=$(echo \"$RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/') # Removes extra characters before the JSON starts\n\n  echo \"$CLEAN_RESPONSE\" | jq -r '.company.sites[] | \"(.display_name) ((.name)) - Status: (.status)\"'\n}<\/code><\/pre>\n<p>Wenn du die Funktion <code>list_sites<\/code> aufrufst, werden deine Seiten wie oben gezeigt angezeigt. Das Hauptziel ist jedoch der Zugriff auf jede Seite und ihre ID, damit du detaillierte Informationen \u00fcber jede Seite abrufen kannst.<\/p>\n<h4>3. Seiten-Details abrufen<\/h4>\n<p>Um Details zu einer bestimmten Seite abzurufen, verwendest du die folgende Funktion, die die Seiten-ID auf der Grundlage des Seitennamens abruft und zus\u00e4tzliche Details wie z. B. Umgebungen abruft:<\/p>\n<pre><code class=\"language-bash\">get_site_details_by_name() {\n  SITE_NAME=$1\n  if [ -z \"$SITE_NAME\" ]; then\n    echo \"Error: No site name provided. Usage: $0 details-name \"\n    return 1\n  fi\n\n  RESPONSE=$(get_sites_list)\n\n  echo \"Searching for site with name: $SITE_NAME...\"\n\n  # Clean the RESPONSE before parsing\n  CLEAN_RESPONSE=$(echo \"$RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')\n\n  # Extract the site ID for the given site name\n  SITE_ID=$(echo \"$CLEAN_RESPONSE\" | jq -r --arg SITE_NAME \"$SITE_NAME\" '.company.sites[] | select(.name == $SITE_NAME) | .id')\n\n  if [ -z \"$SITE_ID\" ]; then\n    echo \"Error: Site with name \"$SITE_NAME\" not found.\"\n    return 1\n  fi\n\n  echo \"Found site ID: $SITE_ID for site name: $SITE_NAME\"\n\n  # Fetch site details using the site ID\n  API_URL=\"$BASE_URL\/sites\/$SITE_ID\"\n\n  SITE_RESPONSE=$(curl -s -X GET \"$API_URL\" \n    -H \"Authorization: Bearer $API_KEY\" \n    -H \"Content-Type: application\/json\")\n\n  echo \"$SITE_RESPONSE\"\n}<\/code><\/pre>\n<p>Die obige Funktion filtert die Site anhand des Seitennamens und ruft dann weitere Details zur Seite \u00fcber den <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Sites#operation\/getSiteById\" target=\"_blank\" rel=\"noopener noreferrer\">\/sites\/&lt;site-id&gt;<\/a><\/code> Endpunkt ab. Zu diesen Details geh\u00f6ren auch die Umgebungen der Website, die wir ben\u00f6tigen, um Backups auszul\u00f6sen.<\/p>\n<h3>Backups erstellen<\/h3>\n<p>Nachdem du nun wiederverwendbare Funktionen zum Abrufen von Website-Details und zum Auflisten von Umgebungen eingerichtet hast, kannst du dich darauf konzentrieren, die Erstellung von Backups zu automatisieren. Das Ziel ist es, einen einfachen Befehl mit dem Namen der Website auszuf\u00fchren und dann interaktiv die Umgebung auszuw\u00e4hlen, die gesichert werden soll.<\/p>\n<p>Beginne damit, eine Funktion zu erstellen (wir nennen sie <code>trigger_manual_backup<\/code>). Innerhalb der Funktion definierst du zwei Variablen: Die erste akzeptiert den Seitennamen als Eingabe und die zweite setzt ein Standard-Tag (<code>default-backup<\/code>) f\u00fcr die Sicherung. Dieses Standard-Tag wird verwendet, es sei denn, du legst sp\u00e4ter ein eigenes Tag fest.<\/p>\n<pre><code class=\"language-bash\">trigger_manual_backup() {\n  SITE_NAME=$1\n  DEFAULT_TAG=\"default-backup\"\n\n  # Ensure a site name is provided\n  if [ -z \"$SITE_NAME\" ]; then\n    echo \"Error: Site name is required.\"\n    echo \"Usage: $0 trigger-backup \"\n    return 1\n  fi\n\n  # Add the code here\n\n}<\/code><\/pre>\n<p><code>SITE_NAME<\/code> ist der Bezeichner f\u00fcr die Website, die du verwalten willst. Du legst auch eine Bedingung fest, damit das Skript mit einer Fehlermeldung beendet wird, wenn die Kennung nicht angegeben wird. So wird sichergestellt, dass das Skript nicht ohne die erforderliche Eingabe fortf\u00e4hrt und m\u00f6gliche API-Fehler vermieden werden.<\/p>\n<p>Als N\u00e4chstes verwendest du die wiederverwendbare Funktion <code>get_site_details_by_name<\/code>, um detaillierte Informationen \u00fcber die Website, einschlie\u00dflich ihrer Umgebungen, abzurufen. Die Antwort wird dann bereinigt, um unerwartete Formatierungsprobleme zu beseitigen, die bei der Verarbeitung auftreten k\u00f6nnten.<\/p>\n<pre><code class=\"language-bash\">SITE_RESPONSE=$(get_site_details_by_name \"$SITE_NAME\")\n\nif [ $? -ne 0 ]; then\n  echo \"Error: Failed to fetch site details for site \"$SITE_NAME\".\"\n  return 1\nfi\n\nCLEAN_RESPONSE=$(echo \"$SITE_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')<\/code><\/pre>\n<p>Sobald wir die Seitendetails haben, extrahiert das folgende Skript alle verf\u00fcgbaren Umgebungen und zeigt sie in einem lesbaren Format an. So kannst du sehen, welche Umgebungen mit der Seite verkn\u00fcpft sind.<\/p>\n<p>Das Skript fordert dich dann auf, eine Umgebung anhand ihres Namens auszuw\u00e4hlen. Dieser interaktive Schritt macht den Prozess benutzerfreundlich, da du dir die Umgebungs-IDs nicht merken oder eingeben musst.<\/p>\n<pre><code class=\"language-bash\">ENVIRONMENTS=$(echo \"$CLEAN_RESPONSE\" | jq -r '.site.environments[] | \"(.name): (.id)\"')\n\necho \"Available Environments for \"$SITE_NAME\":\"\necho \"$ENVIRONMENTS\"\n\nread -p \"Enter the environment name to back up (e.g., staging, live): \" ENV_NAME<\/code><\/pre>\n<p>Der gew\u00e4hlte Umgebungsname wird dann verwendet, um die entsprechende <strong>Umgebungs-ID<\/strong> in den Seitendetails nachzuschlagen. Diese ID wird f\u00fcr API-Anfragen ben\u00f6tigt, um ein Backup zu erstellen.<\/p>\n<pre><code class=\"language-bash\">ENV_ID=$(echo \"$CLEAN_RESPONSE\" | jq -r --arg ENV_NAME \"$ENV_NAME\" '.site.environments[] | select(.name == $ENV_NAME) | .id')\n\nif [ -z \"$ENV_ID\" ]; then\n  echo \"Error: Environment \"$ENV_NAME\" not found for site \"$SITE_NAME\".\"\n  return 1\nfi\n\necho \"Found environment ID: $ENV_ID for environment name: $ENV_NAME\"<\/code><\/pre>\n<p>Im obigen Code wird eine Bedingung erstellt, damit das Skript mit einer Fehlermeldung beendet wird, wenn der angegebene Umgebungsname nicht \u00fcbereinstimmt.<\/p>\n<p>Da du nun die Umgebungs-ID hast, kannst du die aktuelle Anzahl der manuellen Backups f\u00fcr die ausgew\u00e4hlte Umgebung \u00fcberpr\u00fcfen. Da Kinsta die Anzahl der manuellen Backups auf f\u00fcnf pro Umgebung begrenzt, ist dieser Schritt wichtig, um Fehler zu vermeiden.<\/p>\n<p>Wir beginnen damit, die Liste der Backups \u00fcber den <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/getBackups\" target=\"_blank\" rel=\"noopener noreferrer\">\/backups<\/a><\/code> API-Endpunkt.<\/p>\n<pre><code class=\"language-bash\">API_URL=\"$BASE_URL\/sites\/environments\/$ENV_ID\/backups\"\nBACKUPS_RESPONSE=$(curl -s -X GET \"$API_URL\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\")\n\nCLEAN_RESPONSE=$(echo \"$BACKUPS_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')\nMANUAL_BACKUPS=$(echo \"$CLEAN_RESPONSE\" | jq '[.environment.backups[] | select(.type == \"manual\")]')\nBACKUP_COUNT=$(echo \"$MANUAL_BACKUPS\" | jq 'length')<\/code><\/pre>\n<p>Das obige Skript filtert dann nach manuellen Backups und z\u00e4hlt sie. Wenn die Anzahl der Backups das Limit erreicht, m\u00fcssen wir die vorhandenen Backups verwalten:<\/p>\n<pre><code class=\"language-bash\">  if [ \"$BACKUP_COUNT\" -ge 5 ]; then\n    echo \"Manual backup limit reached (5 backups).\"\n    \n    # Find the oldest backup\n    OLDEST_BACKUP=$(echo \"$MANUAL_BACKUPS\" | jq -r 'sort_by(.created_at) | .[0]')\n    OLDEST_BACKUP_NAME=$(echo \"$OLDEST_BACKUP\" | jq -r '.note')\n    OLDEST_BACKUP_ID=$(echo \"$OLDEST_BACKUP\" | jq -r '.id')\n\n    echo \"The oldest manual backup is \"$OLDEST_BACKUP_NAME\".\"\n    read -p \"Do you want to delete this backup to create a new one? (yes\/no): \" CONFIRM\n\n    if [ \"$CONFIRM\" != \"yes\" ]; then\n      echo \"Aborting backup creation.\"\n      return 1\n    fi\n\n    # Delete the oldest backup\n    DELETE_URL=\"$BASE_URL\/sites\/environments\/backups\/$OLDEST_BACKUP_ID\"\n    DELETE_RESPONSE=$(curl -s -X DELETE \"$DELETE_URL\" \n      -H \"Authorization: Bearer $API_KEY\" \n      -H \"Content-Type: application\/json\")\n\n    echo \"Delete Response:\"\n    echo \"$DELETE_RESPONSE\" | jq -r '[\n      \"Operation ID: (.operation_id)\",\n      \"Message: (.message)\",\n      \"Status: (.status)\"\n    ] | join(\"n\")'\n  fi<\/code><\/pre>\n<p>Die obige Bedingung identifiziert das \u00e4lteste Backup, indem sie die Liste nach dem <code>created_at<\/code> Zeitstempel sortiert. Anschlie\u00dfend wirst du aufgefordert, zu best\u00e4tigen, dass du es l\u00f6schen m\u00f6chtest.<\/p>\n<p>Wenn du zustimmst, l\u00f6scht das Skript das \u00e4lteste Backup mit seiner ID und gibt so Platz f\u00fcr das neue Backup frei. Auf diese Weise wird sichergestellt, dass immer Backups erstellt werden k\u00f6nnen, ohne dass die Grenzen manuell verwaltet werden m\u00fcssen.<\/p>\n<p>Da nun Platz vorhanden ist, k\u00f6nnen wir mit dem Code fortfahren, der das Backup f\u00fcr die Umgebung ausl\u00f6st. Du kannst diesen Code gerne \u00fcberspringen, aber f\u00fcr eine bessere Erfahrung wirst du aufgefordert, ein benutzerdefiniertes Tag anzugeben.<\/p>\n<pre><code class=\"language-bash\">read -p \"Enter a backup tag (or press Enter to use \"$DEFAULT_TAG\"): \" BACKUP_TAG\n\nif [ -z \"$BACKUP_TAG\" ]; then\n  BACKUP_TAG=\"$DEFAULT_TAG\"\nfi\n\necho \"Using backup tag: $BACKUP_TAG\"<\/code><\/pre>\n<p>In dem folgenden Skript wird die Sicherung durchgef\u00fchrt. Es sendet eine <code>POST<\/code> Anfrage an den <code><a href=\"https:\/\/api-docs.kinsta.com\/tag\/Backups#operation\/addManualBackup\" target=\"_blank\" rel=\"noopener noreferrer\">\/manual-backups<\/a><\/code> Endpunkt mit der ausgew\u00e4hlten Umgebungs-ID und dem Backup-Tag. Wenn die Anfrage erfolgreich ist, gibt die API eine Antwort zur\u00fcck, die die Erstellung des Backups best\u00e4tigt.<\/p>\n<pre><code class=\"language-bash\">API_URL=\"$BASE_URL\/sites\/environments\/$ENV_ID\/manual-backups\"\nRESPONSE=$(curl -s -X POST \"$API_URL\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\" \n  -d \"{\"tag\": \"$BACKUP_TAG\"}\")\n\nif [ -z \"$RESPONSE\" ]; then\n  echo \"Error: No response from the API while triggering the manual backup.\"\n  return 1\nfi\n\necho \"Backup Trigger Response:\"\necho \"$RESPONSE\" | jq -r '[\n  \"Operation ID: (.operation_id)\",\n  \"Message: (.message)\",\n  \"Status: (.status)\"\n] | join(\"n\")'<\/code><\/pre>\n<p>Das war&#8217;s! Die Antwort auf die obige Anfrage ist so formatiert, dass die ID des Vorgangs, die Meldung und der Status angezeigt werden. Wenn du die Funktion aufrufst und das Skript ausf\u00fchrst, erh\u00e4ltst du eine \u00e4hnliche Ausgabe wie diese:<\/p>\n<pre><code class=\"language-bash\">Available Environments for \"example-site\":\nstaging: 12345\nlive: 67890\nEnter the environment name to back up (e.g., staging, live): live\nFound environment ID: 67890 for environment name: live\nManual backup limit reached (5 backups).\nThe oldest manual backup is \"staging-backup-2023-12-31\".\nDo you want to delete this backup to create a new one? (yes\/no): yes\nOldest backup deleted.\nEnter a backup tag (or press Enter to use \"default-backup\"): weekly-live-backup\nUsing backup tag: weekly-live-backup\nTriggering manual backup for environment ID: 67890 with tag: weekly-live-backup...\nBackup Trigger Response:\nOperation ID: backups:add-manual-abc123\nMessage: Adding a manual backup to environment in progress.\nStatus: 202<\/code><\/pre>\n<h3>Befehle f\u00fcr dein Skript erstellen<\/h3>\n<p>Befehle vereinfachen die Verwendung deines Skripts. Anstatt das Skript zu bearbeiten oder den Code manuell auszukommentieren, k\u00f6nnen die Nutzer es mit einem bestimmten Befehl wie diesem ausf\u00fchren:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh list-sites\n.\/script.sh backup <\/code><\/pre>\n<p>F\u00fcge am Ende deines Skripts (au\u00dferhalb aller Funktionen) einen bedingten Block ein, der die an das Skript \u00fcbergebenen Argumente \u00fcberpr\u00fcft:<\/p>\n<pre><code class=\"language-bash\">if [ \"$1\" == \"list-sites\" ]; then\n  list_sites\nelif [ \"$1\" == \"backup\" ]; then\n  SITE_NAME=\"$2\"\n  if [ -z \"$SITE_NAME\" ]; then\n    echo \"Usage: $0 trigger-backup \"\n    exit 1\n  fi\n  trigger_manual_backup \"$SITE_NAME\"\nelse\n  echo \"Usage: $0 {list-sites|trigger-backup }\"\n  exit 1\nfi<\/code><\/pre>\n<p>Die Variable <code>$1<\/code> steht f\u00fcr das erste Argument, das an das Skript \u00fcbergeben wird (z. B. in <code>.\/script.sh list-sites<\/code>, <code>$1<\/code> ist <code>list-sites<\/code>). Das Skript verwendet bedingte \u00dcberpr\u00fcfungen, um <code>$1<\/code> mit bestimmten Befehlen wie <code>list-sites<\/code> oder <code>backup<\/code> abzugleichen. Wenn der Befehl <code>backup<\/code> lautet, erwartet es auch ein zweites Argument (<code>$2<\/code>), das der Name der Website ist. Wenn kein g\u00fcltiger Befehl angegeben wird, zeigt das Skript standardm\u00e4\u00dfig die Nutzungshinweise an.<\/p>\n<p>Du kannst nun ein manuelles Backup f\u00fcr eine bestimmte Website ausl\u00f6sen, indem du den Befehl ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">.\/script.sh backup<\/code><\/pre>\n<h2>Erweiterter Anwendungsfall 2: Aktualisieren von Plugins \u00fcber mehrere Websites hinweg<\/h2>\n<p>Die Verwaltung von WordPress-Plugins f\u00fcr mehrere Websites kann m\u00fchsam sein, vor allem, wenn Updates verf\u00fcgbar sind. Kinsta macht das \u00fcber das MyKinsta-Dashboard mit der im letzten Jahr eingef\u00fchrten Funktion f\u00fcr Massenaktionen sehr gut.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/manage-plugins-mykinsta.png\" alt><\/p>\n<p>Wenn du aber nicht gerne mit Benutzeroberfl\u00e4chen arbeitest, bietet die Kinsta-API eine weitere M\u00f6glichkeit, ein Shell-Skript zu erstellen, das den Prozess der Identifizierung veralteter Plugins und deren Aktualisierung f\u00fcr mehrere Websites oder bestimmte Umgebungen automatisiert.<\/p>\n<h3>Aufschl\u00fcsselung des Arbeitsablaufs<\/h3>\n<p>1. <strong>Identifiziere Websites mit veralteten Plugins:<\/strong> Das Skript durchl\u00e4uft alle Websites und Umgebungen und sucht nach dem angegebenen Plugin, f\u00fcr das ein Update verf\u00fcgbar ist. Der <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/getPlugins\" target=\"_blank\" rel=\"noopener noreferrer\">folgende Endpunkt<\/a> wird verwendet, um die Liste der Plugins f\u00fcr eine bestimmte Site-Umgebung abzurufen:<\/p>\n<pre><code class=\"language-bash\">GET \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>In der Antwort wird nach Plugins gefiltert, f\u00fcr die <code>\"update\": \"available\"<\/code>.<\/p>\n<p>2. <strong>Aufforderung an den Nutzer, Optionen zur Aktualisierung anzugeben:<\/strong> Es werden die Websites und Umgebungen mit dem veralteten Plugin angezeigt, so dass der Nutzer bestimmte Instanzen ausw\u00e4hlen oder alle aktualisieren kann.<\/p>\n<p>3. <strong>Plugin-Updates ausl\u00f6sen:<\/strong> Um das Plugin in einer bestimmten Umgebung zu aktualisieren, verwendet das Skript <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">diesen Endpunkt<\/a>:<\/p>\n<pre><code class=\"language-bash\">PUT \/sites\/environments\/{env_id}\/plugins<\/code><\/pre>\n<p>Der Name des Plugins und seine aktualisierte Version werden im Request Body \u00fcbergeben.<\/p>\n<h3>Das Skript<\/h3>\n<p>Da das Skript sehr umfangreich ist, wird die vollst\u00e4ndige Funktion <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">auf GitHub gehostet<\/a>, um den Zugang zu erleichtern. Hier erkl\u00e4ren wir die Kernlogik, die verwendet wird, um veraltete Plugins \u00fcber mehrere Websites und Umgebungen hinweg zu identifizieren.<\/p>\n<p>Das Skript beginnt damit, dass es den Plugin-Namen vom Befehl annimmt. Dieser Name gibt das Plugin an, das du aktualisieren m\u00f6chtest.<\/p>\n<pre><code class=\"language-bash\">PLUGIN_NAME=$1\n\nif [ -z \"$PLUGIN_NAME\" ]; then\n  echo \"Error: Plugin name is required.\"\n  echo \"Usage: $0 update-plugin \"\n  return 1\nfi<\/code><\/pre>\n<p>Das Skript verwendet dann die wiederverwendbare Funktion <code>get_sites_list<\/code> (wurde bereits erkl\u00e4rt), um alle Websites des Unternehmens abzurufen:<\/p>\n<pre><code class=\"language-bash\">echo \"Fetching all sites in the company...\"\n\n# Fetch all sites in the company\nSITES_RESPONSE=$(get_sites_list)\nif [ $? -ne 0 ]; then\n  echo \"Error: Failed to fetch sites.\"\n  return 1\nfi\n\n# Clean the response\nCLEAN_SITES_RESPONSE=$(echo \"$SITES_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')<\/code><\/pre>\n<p>Als N\u00e4chstes kommt das Herzst\u00fcck des Skripts: Es durchl\u00e4uft die Liste der Websites, um nach veralteten Plugins zu suchen. Das <code>CLEAN_SITES_RESPONSE<\/code>, ein JSON-Objekt, das alle Seiten enth\u00e4lt, wird an eine while-Schleife \u00fcbergeben, um die Operationen f\u00fcr jede Seite einzeln durchzuf\u00fchren.<\/p>\n<p>Zun\u00e4chst werden einige wichtige Daten wie die Site-ID, der Name und der Anzeigename in Variablen extrahiert:<\/p>\n<pre><code class=\"language-bash\">while IFS= read -r SITE; do\n  SITE_ID=$(echo \"$SITE\" | jq -r '.id')\n  SITE_NAME=$(echo \"$SITE\" | jq -r '.name')\n  SITE_DISPLAY_NAME=$(echo \"$SITE\" | jq -r '.display_name')\n\n  echo \"Checking environments for site \"$SITE_DISPLAY_NAME\"...\"<\/code><\/pre>\n<p>Der Seitenname wird dann zusammen mit der zuvor definierten Funktion <code>get_site_details_by_name<\/code> verwendet, um detaillierte Informationen \u00fcber die Seite, einschlie\u00dflich aller Umgebungen, abzurufen.<\/p>\n<pre><code class=\"language-bash\">SITE_DETAILS=$(get_site_details_by_name \"$SITE_NAME\")\nCLEAN_SITE_DETAILS=$(echo \"$SITE_DETAILS\" | tr -d 'r' | sed 's\/^[^{]*\/\/')\n\nENVIRONMENTS=$(echo \"$CLEAN_SITE_DETAILS\" | jq -r '.site.environments[] | \"(.id):(.name):(.display_name)\"')<\/code><\/pre>\n<p>Die Umgebungen werden dann in einer Schleife abgefragt, um Details zu jeder Umgebung zu erhalten, wie z. B. die ID, den Namen und den Anzeigenamen:<\/p>\n<pre><code class=\"language-bash\">while IFS= read -r ENV; do\n  ENV_ID=$(echo \"$ENV\" | cut -d: -f1)\n  ENV_NAME=$(echo \"$ENV\" | cut -d: -f2)\n  ENV_DISPLAY_NAME=$(echo \"$ENV\" | cut -d: -f3)\n\n  echo \"Checking plugins for environment \"$ENV_DISPLAY_NAME\"...\"<\/code><\/pre>\n<p>F\u00fcr jede Umgebung holt sich das Skript nun die Liste der Plugins \u00fcber die Kinsta-API.<\/p>\n<pre><code class=\"language-bash\">PLUGINS_RESPONSE=$(curl -s -X GET \"$BASE_URL\/sites\/environments\/$ENV_ID\/plugins\" \n  -H \"Authorization: Bearer $API_KEY\" \n  -H \"Content-Type: application\/json\")\n\nCLEAN_PLUGINS_RESPONSE=$(echo \"$PLUGINS_RESPONSE\" | tr -d 'r' | sed 's\/^[^{]*\/\/')<\/code><\/pre>\n<p>Als N\u00e4chstes pr\u00fcft das Skript, ob das angegebene Plugin in der Umgebung existiert und ein Update verf\u00fcgbar ist:<\/p>\n<pre><code class=\"language-bash\">OUTDATED_PLUGIN=$(echo \"$CLEAN_PLUGINS_RESPONSE\" | jq -r --arg PLUGIN_NAME \"$PLUGIN_NAME\" '.environment.container_info.wp_plugins.data[] | select(.name == $PLUGIN_NAME and .update == \"available\")')<\/code><\/pre>\n<p>Wenn ein veraltetes Plugin gefunden wird, protokolliert das Skript seine Details und f\u00fcgt sie dem Array <code>SITES_WITH_OUTDATED_PLUGIN<\/code> hinzu:<\/p>\n<pre><code class=\"language-bash\">if [ ! -z \"$OUTDATED_PLUGIN\" ]; then\n  CURRENT_VERSION=$(echo \"$OUTDATED_PLUGIN\" | jq -r '.version')\n  UPDATE_VERSION=$(echo \"$OUTDATED_PLUGIN\" | jq -r '.update_version')\n\n  echo \"Outdated plugin \"$PLUGIN_NAME\" found in \"$SITE_DISPLAY_NAME\" (Environment: $ENV_DISPLAY_NAME)\"\n  echo \"  Current Version: $CURRENT_VERSION\"\n  echo \"  Update Version: $UPDATE_VERSION\"\n\n  SITES_WITH_OUTDATED_PLUGIN+=(\"$SITE_DISPLAY_NAME:$ENV_DISPLAY_NAME:$ENV_ID:$UPDATE_VERSION\")\nfi<\/code><\/pre>\n<p>So w\u00fcrden die protokollierten Details veralteter Plugins aussehen:<\/p>\n<pre><code class=\"language-bash\">Outdated plugin \"example-plugin\" found in \"Site ABC\" (Environment: Production)\n  Current Version: 1.0.0\n  Update Version: 1.2.0\nOutdated plugin \"example-plugin\" found in \"Site XYZ\" (Environment: Staging)\n  Current Version: 1.3.0\n  Update Version: 1.4.0<\/code><\/pre>\n<p>Von hier aus f\u00fchren wir Plugin-Updates f\u00fcr jedes Plugin \u00fcber <a href=\"https:\/\/api-docs.kinsta.com\/tag\/WordPress-Site-Themes-and-Plugins#operation\/updatePlugin\" target=\"_blank\" rel=\"noopener noreferrer\">seinen Endpunkt<\/a> durch. Das vollst\u00e4ndige Skript findest du in diesem <a href=\"https:\/\/github.com\/olawanlejoel\/KinstaAPI-Shell\/blob\/main\/script.sh#L371\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub-Repository<\/a>.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Dieser Artikel hat dich durch die Erstellung eines Shell-Skripts zur Interaktion mit der Kinsta-API gef\u00fchrt.<\/p>\n<p>Nimm dir etwas Zeit, um die <a href=\"https:\/\/api-docs.kinsta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Kinsta-API<\/a> weiter zu erkunden &#8211; du wirst zus\u00e4tzliche Funktionen entdecken, die du automatisieren kannst, um Aufgaben zu erledigen, die auf deine speziellen Bed\u00fcrfnisse zugeschnitten sind. Du k\u00f6nntest die API auch mit anderen APIs integrieren, um die Entscheidungsfindung und Effizienz zu verbessern.<\/p>\n<p>Und schlie\u00dflich solltest du das <a href=\"https:\/\/kinsta.com\/de\/mykinsta\/\">MyKinsta-Dashboard<\/a> regelm\u00e4\u00dfig auf neue Funktionen \u00fcberpr\u00fcfen, die die Verwaltung der Website dank der intuitiven Oberfl\u00e4che noch benutzerfreundlicher machen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn du viele WordPress-Seiten verwaltest, bist du wahrscheinlich immer auf der Suche nach M\u00f6glichkeiten, deine Arbeitsabl\u00e4ufe zu vereinfachen und zu beschleunigen. Stell dir Folgendes vor: Mit &#8230;<\/p>\n","protected":false},"author":287,"featured_media":72738,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[925],"class_list":["post-72737","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Verwalte deine WordPress-Seiten mit Shell-Skripten und der Kinsta-API<\/title>\n<meta name=\"description\" content=\"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deine WordPress-Seiten mit Shell-Skripten und Kinsta API verwalten\" \/>\n<meta property=\"og:description\" content=\"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-04T06:35:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-04T07:35:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Joel Olawanle\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management-1024x512.png\" \/>\n<meta name=\"twitter:creator\" content=\"@olawanle_joel\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\"},\"headline\":\"Deine WordPress-Seiten mit Shell-Skripten und Kinsta API verwalten\",\"datePublished\":\"2025-03-04T06:35:03+00:00\",\"dateModified\":\"2025-03-04T07:35:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/\"},\"wordCount\":2467,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/\",\"name\":\"Verwalte deine WordPress-Seiten mit Shell-Skripten und der Kinsta-API\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"datePublished\":\"2025-03-04T06:35:03+00:00\",\"dateModified\":\"2025-03-04T07:35:45+00:00\",\"description\":\"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Deine WordPress-Seiten mit Shell-Skripten und Kinsta API verwalten\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g\",\"caption\":\"Joel Olawanle\"},\"description\":\"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.\",\"sameAs\":[\"https:\/\/joelolawanle.com\/\",\"https:\/\/www.linkedin.com\/in\/olawanlejoel\/\",\"https:\/\/x.com\/olawanle_joel\",\"https:\/\/www.youtube.com\/@joelolawanle\"],\"gender\":\"male\",\"knowsAbout\":[\"JavaScript\",\"React\",\"Next.js\"],\"knowsLanguage\":[\"English\"],\"jobTitle\":\"Technical Editor\",\"worksFor\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/author\/joelolawanle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Verwalte deine WordPress-Seiten mit Shell-Skripten und der Kinsta-API","description":"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/","og_locale":"de_DE","og_type":"article","og_title":"Deine WordPress-Seiten mit Shell-Skripten und Kinsta API verwalten","og_description":"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.","og_url":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2025-03-04T06:35:03+00:00","article_modified_time":"2025-03-04T07:35:45+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","type":"image\/png"}],"author":"Joel Olawanle","twitter_card":"summary_large_image","twitter_description":"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management-1024x512.png","twitter_creator":"@olawanle_joel","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Joel Olawanle","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07"},"headline":"Deine WordPress-Seiten mit Shell-Skripten und Kinsta API verwalten","datePublished":"2025-03-04T06:35:03+00:00","dateModified":"2025-03-04T07:35:45+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/"},"wordCount":2467,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/","url":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/","name":"Verwalte deine WordPress-Seiten mit Shell-Skripten und der Kinsta-API","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","datePublished":"2025-03-04T06:35:03+00:00","dateModified":"2025-03-04T07:35:45+00:00","description":"Verwalte deine WordPress-Seiten effizient mit Shell-Skripten und der Kinsta-API f\u00fcr optimierte Automatisierung und Leistung.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2025\/02\/how-to-use-shell-scripts-and-the-kinsta-api-for-wordpress-management.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/shell-skripte-kinsta-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/de\/thema\/api\/"},{"@type":"ListItem","position":3,"name":"Deine WordPress-Seiten mit Shell-Skripten und Kinsta API verwalten"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/efa7de30245ca15be5ce1dcacff89c07","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/051bf577ce2c837846a1db9eef184758?s=96&d=mm&r=g","caption":"Joel Olawanle"},"description":"Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 300 technical articles majorly around JavaScript and it's frameworks.","sameAs":["https:\/\/joelolawanle.com\/","https:\/\/www.linkedin.com\/in\/olawanlejoel\/","https:\/\/x.com\/olawanle_joel","https:\/\/www.youtube.com\/@joelolawanle"],"gender":"male","knowsAbout":["JavaScript","React","Next.js"],"knowsLanguage":["English"],"jobTitle":"Technical Editor","worksFor":"Kinsta","url":"https:\/\/kinsta.com\/de\/blog\/author\/joelolawanle\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/72737","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/287"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=72737"}],"version-history":[{"count":5,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/72737\/revisions"}],"predecessor-version":[{"id":72760,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/72737\/revisions\/72760"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/translations\/es"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/72737\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/72738"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=72737"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=72737"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=72737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}