# Drush — Die Kommandozeile für Drupal

> Drush ist das Kommandozeilen-Tool für Drupal: Cache leeren, Module verwalten, Datenbank und Config-Sync automatisieren. Für Drupal 8 bis 11.

Source: https://www.jpkc.com/db/cheatsheets/build-languages/drush/

<!-- PROSE:intro -->
Drush — kurz für Drupal Shell — ist das Kommandozeilen-Werkzeug, mit dem du eine Drupal-Installation steuerst, ohne dich durch die Administrationsoberfläche zu klicken. Cache leeren, Module aktivieren, Konfiguration zwischen Umgebungen synchronisieren, Datenbank-Updates ausführen oder ein komplettes Deployment anstoßen – all das erledigst du mit kurzen, skriptbaren Befehlen. Drush unterstützt die aktuellen Drupal-Versionen 8 bis 11 und ist aus dem Alltag von Drupal-Entwicklung und -Betrieb kaum wegzudenken. Dieser Guide zeigt dir die wichtigsten Kommandos von der Statusabfrage bis zum produktiven Deploy.
<!-- PROSE:intro:end -->

## Kern & Info

`drush --version` — Zeigt die installierte Drush-Version an.

```bash
drush --version
```

`drush status` — Zeigt den Status der Drupal-Site an: Root-Verzeichnis, URI, Datenbank, PHP-Version, Drush-Version usw.

```bash
drush status
```

`drush status --fields=drupal-version,db-status` — Zeigt nur bestimmte Statusfelder an.

```bash
drush status --fields=drupal-version,db-status
```

`drush list` — Listet alle verfügbaren Drush-Befehle auf.

```bash
drush list
```

`drush list --filter=<group>` — Listet die Befehle einer bestimmten Gruppe auf (z. B. cache, config, pm, sql, user).

```bash
drush list --filter=config
```

`drush help <command>` — Zeigt Hilfe und alle Optionen zu einem bestimmten Drush-Befehl an.

```bash
drush help config:export
```

`drush core:requirements` — Zeigt Drupals Statusbericht an (entspricht admin/reports/status). Listet etwaige Probleme der Site auf.

```bash
drush core:requirements
```

`drush core:edit` — Öffnet die aktive services.yml in deinem Standard-Editor.

```bash
drush core:edit
```

## Cache

`drush cache:rebuild` — Baut alle Caches neu auf. Das Drupal-8+-Äquivalent zu cache-clear all. Alias: cr

```bash
drush cache:rebuild
```

`drush cr` — Alias für cache:rebuild. Der am häufigsten genutzte Drush-Befehl.

```bash
drush cr
```

`drush cache:clear <bin>` — Leert einen bestimmten Cache-Bin (z. B. render, page, menu, css_js, theme, token).

```bash
drush cache:clear render
```

`drush cache:get <cid> <bin>` — Liest einen bestimmten Cache-Eintrag anhand seiner Cache-ID aus und zeigt ihn an.

```bash
drush cache:get my_module.data default
```

`drush cache:set <cid> <data> <bin>` — Schreibt einen beliebigen Wert in einen bestimmten Cache-Bin.

```bash
drush cache:set my_key "hello" default
```

## Konfiguration

`drush config:export` — Exportiert die aktive Drupal-Konfiguration in das Sync-Verzeichnis (config/sync). Alias: cex

```bash
drush config:export
```

`drush cex` — Alias für config:export.

```bash
drush cex
```

`drush config:import` — Importiert die Konfiguration aus dem Sync-Verzeichnis in die aktive Datenbank-Konfiguration. Alias: cim

```bash
drush config:import
```

`drush cim` — Alias für config:import.

```bash
drush cim
```

`drush config:import --partial` — Importiert nur die im Sync-Verzeichnis vorhandenen Config-Dateien und ignoriert fehlende.

```bash
drush config:import --partial
```

`drush config:status` — Zeigt, welche Konfigurationselemente sich zwischen aktivem (DB) und Sync-Verzeichnis (Dateien) unterscheiden.

```bash
drush config:status
```

`drush config:diff <name>` — Zeigt den Unterschied zwischen aktiver und synchronisierter Config für ein bestimmtes Config-Element.

```bash
drush config:diff system.site
```

`drush config:get <name>` — Zeigt den vollständigen Wert eines Konfigurationsobjekts an.

```bash
drush config:get system.site
```

`drush config:get <name> <key>` — Liest einen bestimmten Schlüssel aus einem Konfigurationsobjekt aus.

```bash
drush config:get system.site name
```

`drush config:set <name> <key> <value>` — Setzt einen bestimmten Konfigurationsschlüssel auf einen neuen Wert.

```bash
drush config:set system.site name "My Drupal Site"
```

`drush config:delete <name>` — Löscht ein Konfigurationsobjekt vollständig aus dem aktiven Speicher.

```bash
drush config:delete my_module.settings
```

`drush config:edit <name>` — Öffnet ein Konfigurationselement im Editor. Änderungen werden beim Beenden gespeichert.

```bash
drush config:edit system.performance
```

## Module & Themes (pm)

`drush pm:list` — Listet alle installierten Module und Themes mit ihrem Status auf. Alias: pml

```bash
drush pm:list
```

`drush pm:list --status=enabled` — Listet nur aktivierte Module und Themes auf.

```bash
drush pm:list --status=enabled
```

`drush pm:list --type=module` — Listet nur Module auf (keine Themes oder Profile).

```bash
drush pm:list --type=module
```

`drush pm:enable <module>` — Aktiviert ein oder mehrere Module. Drush löst Abhängigkeiten automatisch auf. Alias: en

```bash
drush pm:enable views devel
```

`drush en <module>` — Alias für pm:enable.

```bash
drush en admin_toolbar
```

`drush pm:uninstall <module>` — Deinstalliert ein oder mehrere Module und entfernt deren Konfiguration/Daten. Alias: pmu

```bash
drush pm:uninstall devel
```

`drush pm:info <module>` — Zeigt detaillierte Informationen zu einem Modul oder Theme an.

```bash
drush pm:info views
```

## Updates & Deployment

`drush updatedb` — Führt ausstehende Datenbank-Update-Hooks aus (aus hook_update_N). Alias: updb

```bash
drush updatedb
```

`drush updb` — Alias für updatedb.

```bash
drush updb
```

`drush updatedb --no-post-updates` — Führt DB-Updates aus, überspringt aber Post-Update-Hooks.

```bash
drush updatedb --no-post-updates
```

`drush deploy` — Standard-Deployment-Sequenz: updatedb, config:import, cache:rebuild, deploy:hook. Nach dem Einspielen von Code verwenden.

```bash
drush deploy
```

`drush deploy:hook` — Führt alle ausstehenden hook_deploy_NAME()-Funktionen aus (Post-Deploy-Aufgaben).

```bash
drush deploy:hook
```

`drush core:update` — Spielt ausstehende Drupal-Core-Updates ein (enthält updb, cim, cr).

```bash
drush core:update
```

`drush state:set system.maintenance_mode 1 --input-format=integer && drush cr` — Aktiviert den Wartungsmodus und leert den Cache (vor einem Deployment).

```bash
drush state:set system.maintenance_mode 1 --input-format=integer && drush cr
```

`drush state:set system.maintenance_mode 0 --input-format=integer && drush cr` — Deaktiviert den Wartungsmodus und leert den Cache (nach einem Deployment).

```bash
drush state:set system.maintenance_mode 0 --input-format=integer && drush cr
```

## Datenbank

`drush sql:cli` — Öffnet eine interaktive SQL-Shell, die mit der Drupal-Datenbank verbunden ist. Alias: sqlc

```bash
drush sql:cli
```

`drush sql:query "<query>"` — Führt eine SQL-Abfrage direkt gegen die Drupal-Datenbank aus. Alias: sqlq

```bash
drush sql:query "SELECT uid, name, mail FROM users_field_data LIMIT 10;"
```

`drush sql:dump` — Exportiert die vollständige Drupal-Datenbank als SQL-Dump nach stdout.

```bash
drush sql:dump > backup.sql
```

`drush sql:dump --gzip --result-file=<file>` — Exportiert die Datenbank in eine komprimierte SQL-Datei.

```bash
drush sql:dump --gzip --result-file=backup.sql
```

`drush sql:dump --tables-list=<tables>` — Dumpt nur bestimmte Tabellen (kommagetrennt).

```bash
drush sql:dump --tables-list=node,node_field_data
```

`drush sql:drop` — Löscht alle Tabellen der Drupal-Datenbank. Mit Vorsicht verwenden!

```bash
drush sql:drop
```

`drush sql:sanitize` — Bereinigt die Datenbank, indem E-Mail-Adressen verfremdet und Passwörter zurückgesetzt werden. Vor der Weitergabe auf Produktions-Dumps anwenden.

```bash
drush sql:sanitize
```

`drush sql:sanitize --sanitize-password=<pass>` — Bereinigt die Datenbank und setzt für alle Benutzer ein bestimmtes Passwort.

```bash
drush sql:sanitize --sanitize-password=admin
```

`drush sql:connect` — Gibt die DB-Verbindungszeichenfolge zur Verwendung mit anderen Tools aus.

```bash
drush sql:connect
```

`drush sql:create` — Erstellt die in settings.php definierte Datenbank (falls sie noch nicht existiert).

```bash
drush sql:create
```

## Benutzerverwaltung

`drush user:login` — Erzeugt eine Einmal-Login-URL für Benutzer 1 (Admin). Alias: uli

```bash
drush user:login
```

`drush uli` — Alias für user:login. Öffnet eine Einmal-Login-URL für den Admin.

```bash
drush uli
```

`drush user:login --name=<username>` — Erzeugt eine Einmal-Login-URL für einen bestimmten Benutzer.

```bash
drush user:login --name=editor
```

`drush user:info <username>` — Zeigt Informationen zu einem bestimmten Benutzerkonto an.

```bash
drush user:info admin
```

`drush user:create <username> --mail=<email> --password=<pass>` — Erstellt ein neues Benutzerkonto.

```bash
drush user:create john --mail=john@example.com --password=secret
```

`drush user:password <username> <password>` — Setzt ein neues Passwort für ein Benutzerkonto. Alias: upwd

```bash
drush user:password admin newpassword123
```

`drush upwd <username> <password>` — Alias für user:password.

```bash
drush upwd admin admin
```

`drush user:block <username>` — Blockiert (deaktiviert) ein Benutzerkonto.

```bash
drush user:block spammer
```

`drush user:unblock <username>` — Hebt die Blockierung eines zuvor gesperrten Benutzerkontos auf.

```bash
drush user:unblock john
```

`drush user:cancel <username>` — Löscht ein Benutzerkonto.

```bash
drush user:cancel olduser
```

`drush user:role:add <role> <username>` — Fügt einem bestehenden Benutzer eine Rolle hinzu.

```bash
drush user:role:add editor john
```

`drush user:role:remove <role> <username>` — Entfernt eine Rolle von einem Benutzer.

```bash
drush user:role:remove editor john
```

## State & Variablen

`drush state:get <key>` — Liest den Wert einer Drupal-State-Variable aus.

```bash
drush state:get system.cron_last
```

`drush state:set <key> <value>` — Setzt eine Drupal-State-Variable auf einen neuen Wert.

```bash
drush state:set system.maintenance_mode 1
```

`drush state:delete <key>` — Löscht eine Drupal-State-Variable.

```bash
drush state:delete mymodule.custom_flag
```

## Cron & Queue

`drush cron` — Führt alle fälligen Cron-Aufgaben aus, wie sie von hook_cron() der Module definiert sind.

```bash
drush cron
```

`drush queue:list` — Listet alle verfügbaren Queues mit ihrer Anzahl an Einträgen auf.

```bash
drush queue:list
```

`drush queue:run <queue>` — Verarbeitet alle Einträge einer bestimmten Queue.

```bash
drush queue:run mymodule_import_queue
```

`drush queue:run <queue> --items-limit=<n>` — Verarbeitet nur eine begrenzte Anzahl an Queue-Einträgen.

```bash
drush queue:run mymodule_import_queue --items-limit=50
```

`drush queue:delete <queue>` — Löscht alle Einträge einer bestimmten Queue, ohne sie zu verarbeiten.

```bash
drush queue:delete mymodule_import_queue
```

## Watchdog (Logging)

`drush watchdog:show` — Zeigt die jüngsten Watchdog-Logeinträge an. Alias: ws

```bash
drush watchdog:show
```

`drush ws` — Alias für watchdog:show.

```bash
drush ws
```

`drush watchdog:show --count=<n>` — Zeigt die letzten N Watchdog-Einträge an (Standard: 10).

```bash
drush watchdog:show --count=50
```

`drush watchdog:show --severity=<level>` — Filtert nach Schweregrad: debug, info, notice, warning, error, critical, alert, emergency.

```bash
drush watchdog:show --severity=error
```

`drush watchdog:show --type=<type>` — Filtert Watchdog-Meldungen nach Typ (z. B. php, cron, user, system).

```bash
drush watchdog:show --type=php
```

`drush watchdog:show --filter=<string>` — Filtert Watchdog-Meldungen, die eine bestimmte Zeichenkette enthalten.

```bash
drush watchdog:show --filter="Access denied"
```

`drush watchdog:tail` — Verfolgt das Watchdog-Log in Echtzeit (wie tail -f). Alias: wt

```bash
drush watchdog:tail
```

`drush watchdog:delete --severity=<level>` — Löscht Watchdog-Einträge eines bestimmten Schweregrads.

```bash
drush watchdog:delete --severity=debug
```

`drush watchdog:delete --all` — Löscht alle Watchdog-Einträge.

```bash
drush watchdog:delete --all
```

## Site-Installation

`drush site:install` — Installiert Drupal mit dem Standard-Profil. Löscht und erstellt alle Tabellen neu. Alias: si

```bash
drush site:install
```

`drush si <profile>` — Installiert Drupal mit einem bestimmten Installationsprofil.

```bash
drush si minimal
```

`drush site:install --db-url=mysql://user:pass@localhost/dbname` — Installiert Drupal mit einer bestimmten Datenbank-Verbindungszeichenfolge.

```bash
drush site:install --db-url=mysql://drupal:drupal@localhost/drupal
```

`drush site:install --account-name=<name> --account-pass=<pass> --account-mail=<email>` — Setzt die Zugangsdaten des Admin-Kontos während der Installation.

```bash
drush site:install --account-name=admin --account-pass=admin --account-mail=admin@example.com
```

`drush site:install --site-name="<name>" --site-mail=<email>` — Setzt Site-Name und Site-E-Mail während der Installation.

```bash
drush site:install --site-name="My Drupal" --site-mail=info@example.com
```

`drush site:install --existing-config` — Installiert Drupal aus bestehender Konfiguration im Verzeichnis config/sync.

```bash
drush site:install --existing-config
```

## Aliase & Multi-Site

`drush @<alias> <command>` — Führt einen Befehl auf einer entfernten oder alternativen Drupal-Site aus, die über einen Site-Alias definiert ist.

```bash
drush @prod cache:rebuild
```

`drush site:alias` — Zeigt alle definierten Site-Aliase an.

```bash
drush site:alias
```

`drush sql:sync @<source> @<target>` — Kopiert die Datenbank von einem Site-Alias zu einem anderen (z. B. Prod nach Local).

```bash
drush sql:sync @prod @self
```

`drush rsync @<source>:%files/ @<target>:%files/` — Synchronisiert Dateien zwischen zwei Site-Aliasen per rsync.

```bash
drush rsync @prod:%files/ @self:%files/
```

`drush --uri=<uri> <command>` — Führt einen Befehl gezielt für eine bestimmte Multisite-URI aus.

```bash
drush --uri=sub.example.com cache:rebuild
```

`drush --root=/var/www/drupal <command>` — Zielt auf eine Drupal-Installation in einem bestimmten Verzeichnispfad.

```bash
drush --root=/var/www/drupal status
```

## Generate (Code-Generierung)

`drush generate` — Listet alle verfügbaren Code-Generatoren auf.

```bash
drush generate
```

`drush generate module` — Erstellt interaktiv das Grundgerüst eines neuen Custom-Moduls mit allen Boilerplate-Dateien.

```bash
drush generate module
```

`drush generate controller` — Generiert eine Drupal-Controller-Klasse für ein Modul.

```bash
drush generate controller
```

`drush generate service` — Generiert eine Drupal-Service-Klasse samt Service-Definition.

```bash
drush generate service
```

`drush generate form` — Generiert eine Drupal-Formular-Klasse (ConfigFormBase oder FormBase).

```bash
drush generate form
```

`drush generate plugin:block` — Generiert eine eigene Block-Plugin-Klasse.

```bash
drush generate plugin:block
```

`drush generate plugin:field:type` — Generiert ein eigenes Field-Type-Plugin.

```bash
drush generate plugin:field:type
```

`drush generate theme` — Erstellt das Grundgerüst eines neuen Custom-Themes mit allen erforderlichen Dateien.

```bash
drush generate theme
```

`drush generate hook` — Generiert die Implementierung eines Drupal-Hooks in der .module-Datei eines Moduls.

```bash
drush generate hook
```

## Typischer Deployment-Workflow

`git pull && drush deploy` — Holt den neuesten Code und führt die vollständige Drupal-Deploy-Sequenz aus (updb + cim + cr + deploy:hook).

```bash
git pull && drush deploy
```

`drush state:set system.maintenance_mode 1 --input-format=integer && drush cr` — Schritt 1: Wartungsmodus vor dem Deployment aktivieren.

```bash
drush state:set system.maintenance_mode 1 --input-format=integer && drush cr
```

`drush updatedb -y && drush config:import -y && drush cache:rebuild` — Schritt 2: DB-Updates ausführen, Config importieren, Caches neu aufbauen.

```bash
drush updatedb -y && drush config:import -y && drush cache:rebuild
```

`drush state:set system.maintenance_mode 0 --input-format=integer && drush cr` — Schritt 3: Wartungsmodus nach dem Deployment deaktivieren.

```bash
drush state:set system.maintenance_mode 0 --input-format=integer && drush cr
```

`drush sql:dump --gzip --result-file=pre-deploy.sql && drush deploy` — Vor dem Ausführen des deploy-Befehls einen DB-Backup-Dump anlegen.

```bash
drush sql:dump --gzip --result-file=pre-deploy.sql && drush deploy
```

`drush sql:sync @prod @self && drush config:import -y && drush cr` — Produktions-DB lokal einspielen, lokale Config importieren, Cache neu aufbauen.

```bash
drush sql:sync @prod @self && drush config:import -y && drush cr
```

<!-- PROSE:outro -->
## Fazit

Drush macht aus wiederkehrenden Drupal-Aufgaben kurze, wiederholbare Befehle – genau das, was du für saubere Deployments und reproduzierbare Umgebungen brauchst. Einige Kommandos solltest du jedoch mit Respekt behandeln: `sql:drop` löscht ausnahmslos alle Tabellen deiner Datenbank, `sql:cli` und `sql:dump` legen die Datenbank-Zugangsdaten offen, und `updatedb` (`updb`) wie auch `cache:rebuild` (`cr`) führst du in Produktion nur bewusst und idealerweise im Wartungsmodus aus. Lege vor jedem größeren Eingriff einen Datenbank-Dump an, dann ist ein Fehlgriff schnell rückgängig gemacht.

## Weiterführende Links

- [Drush-Dokumentation](https://www.drush.org/) – offizielle Dokumentation mit Befehlsreferenz und Anleitungen (englisch)
- [Drupal-Dokumentation](https://www.drupal.org/docs) – offizielle Drupal-Dokumentation rund um Entwicklung und Betrieb (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [artisan](https://www.jpkc.com/db/cheatsheets/build-languages/artisan/) – Kommandozeilen-Tool des Laravel-Frameworks
- [cargo](https://www.jpkc.com/db/cheatsheets/build-languages/cargo/) – Build-Tool und Paketmanager für Rust
- [composer](https://www.jpkc.com/db/cheatsheets/build-languages/composer/) – Abhängigkeitsmanager für PHP-Projekte

