Wenn Claude Code kein Deutsch kann
Über einen hartnäckigen Clipboard-Bug, eine abgeschottete WSL2, und acht Zeilen Bash als elegante Mogelpackung für ein reales Problem
Seit diesem Jahr bin ich ein Claude Code Power User: Ich arbeite täglich intensiv mit dem Tool im integrierten Terminal von VS Code. Links die Dateien, in der Mitte Code und Tabs, unten Claude. Ich entwickle auf Deutsch, ich bekomme Antworten auf Deutsch, und ich führe echte Gespräche mit dem Tool — nicht nur "schreib mir eine Funktion", sondern Diskussionen über Architektur, Abwägungen, Alternativen.
Ein zentraler Teil dieses Workflows: Ich kopiere Sätze aus Claudes Antworten in die Eingabezeile, um sie zu
kommentieren, zu hinterfragen, zu referenzieren. Ich markiere einen Absatz mit der Maus, Rechtsklick, Einfügen
— und baue darauf auf. Manchmal kopiere ich auch längere Absätze in eine andere Datei, um später darauf
zurückzugreifen. Das ist keine Kleinigkeit am Rande meines Workflows.
Es ist ein Kernbestandteil davon.
Und genau das funktionierte plötzlich nicht mehr.
Ausgenommen auf meiner alten Debian-Distro mit der alten Claude-Code-Version — dort lief alles wie gehabt. Aber auf meiner frisch aufgesetzten neuen Distro mit der aktuellsten Claude-Code-Version (über den claude-eigenen Installer): kaputt . Beide Distros waren isoliert. Beide hatten dieselbe WSL-Konfiguration. Der Unterschied war: neue Distro, neue Version. Und das Ergebnis war das:
ð¥ Neues aus der verrückten Hölle der Zeichensätze! ð¤¯
Statt 🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯1. Das hat mich — ich sage es offen — sofort in den Wahnsinn getrieben!
TL;DR — Du kennst das Problem und willst nur den Fix?
Voraussetzung: WSL2, Windows 11, abgeschottete Distro (
interop enabled = false).sudo apt install wl-clipboard sudo tee /usr/local/bin/powershell.exe << 'EOF' #!/bin/bash if [[ "$*" == *"Set-Clipboard"* ]]; then cat | wl-copy elif [[ "$*" == *"Get-Clipboard"* ]]; then wl-paste --no-newline fi EOF sudo chmod +x /usr/local/bin/powershell.exe
Wer das Muster kennt, weiß sofort was es ist: UTF-8-Bytes, die als Latin-1 gelesen werden. ä ist die Latin-1-Darstellung der beiden UTF-8-Bytes 0xC3 0xA4, die zusammen das ä
ergeben. Jemand irgendwo in der Kette liest UTF-8, als wäre es Latin-1. Klassischer Encoding-Fehler,
Brot-und-Butter-Problem. Aber wo genau?
Die erste Stunde: Verdächtige ohne Motiv
VS Code war der naheliegende erste Verdächtige. Das integrierte Terminal, die WSL-Extension, irgendeine Encoding-Einstellung, die ich übersehen hatte. Ich verbrachte eine gute Stunde damit, alle üblichen Kandidaten abzuhaken.
settings.json: terminal.integrated.defaultEncoding, files.encoding, terminal.integrated.env.linux mit explizitem LANG=de_DE.UTF-8. Alles gesetzt, alles neu gestartet, kein Effekt.
Locales auf der frisch aufgesetzten Debian-Distro: dpkg-reconfigure locales, locale-gen de_DE.UTF-8, update-locale. ~/.bashrc und ~/.inputrc geprüft und angepasst.
locale
# LANG=de_DE.UTF-8
# LC_CTYPE="de_DE.UTF-8"
# LC_ALL=de_DE.UTF-8
# ... alles korrekt
Und dann der entscheidende Test, der VS Code aus dem Spiel nahm: dieselbe lokale VS Code-Instanz, dieselbe Konfiguration, dieselbe Vorgehensweise — aber verbunden mit meiner alten Debian-Distro, auf der eine ältere Claude-Code-Version lief. Kein Bug. Alles korrekt.
VS Code ist konstant. Der Bug ist es nicht. Also liegt es an Claude Code.
Das war der Moment, wo es interessant wurde.
Was das Terminal weiß — und was Claude Code davon hält
Ein paar schnelle Tests zeigten: Das Terminal selbst hat kein Encoding-Problem.
echo "🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯"
# → 🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯 ✓
printf '\xc3\xa4\xc3\xb6\xc3\xbc\n'
# → äöü ✓
UTF-8 funktioniert einwandfrei in der Shell. Das Problem liegt spezifisch in Claude Code — und nach etwas genauerer Beobachtung noch spezifischer: nicht beim Tippen, nicht beim Anzeigen, nicht beim Einfügen von außen. Nur beim Kopieren innerhalb der Claude-Code-TUI und anschließendem Einfügen.
Claude Code hat, wie sich herausstellt, einen eigenen internen Clipboard-Mechanismus. Wenn man Text in der TUI
markiert und kopiert, erscheint die Meldung
"copied n chars to clipboard"
— Claude Code verwaltet den Clipboard-Inhalt selbst, geht nicht einfach durch den Terminal-Layer. Und genau
dieser Mechanismus war kaputt.
Umgebungsvariablen halfen nicht:
LANG=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 claude
TERM=xterm claude
TERM=linux claude
# → alles ohne Effekt
Warum mein Setup den Bug sichtbar macht
Bevor ich ins Binary schaue, ein wichtiger Kontext — denn ohne ihn ergibt der Rest keinen Sinn.
Ich entwickle in einer abgeschotteten WSL2-Umgebung. "Abgeschottet" bedeutet in meinem Fall drei Zeilen in der
/etc/wsl.conf:
[interop]
enabled = false
appendWindowsPath = false
Diese drei Zeilen sorgen dafür, dass meine WSL2-Instanz Windows nicht kennt. Kein /mnt/c
. Kein Windows-PATH. Keine Windows-Binaries, die aus Linux heraus aufgerufen werden können. Die WSL läuft als
geschlossene Welt — was darin passiert, bleibt darin. Genauer gesagt: Windows-Binaries und der Windows-PATH
bleiben draußen. Netzwerkzugriff hat die WSL weiterhin — das ist für Entwicklungsarbeit schlicht notwendig.
Warum? Weil bun install
kein Recht hat, meine SSH-Schlüssel zu lesen. Weil eine kompromittierte Abhängigkeit in einem Testprojekt
keinen Zugriff auf meine Windows-Benutzerdaten haben soll. Das ist eine bewusste Entscheidung, keine
Vergesslichkeit.
Die Konsequenz: powershell.exe liegt nicht im PATH. Wenn Claude Code versucht, powershell.exe aufzurufen, findet es ... nichts.
Mit diesem Kontext im Hinterkopf — zurück zum Binary.
Der Blick ins Binary: Detektivarbeit mit Bordmitteln
Hier wurde es richtig spannend — und hier musste ich einen Umweg nehmen, der sich als der eigentlich aufschlussreiche Weg herausstellte.
Claude Code ist proprietär — es gibt kein GitHub-Repository in das man einfach reinschauen könnte, kein git log
, das die Implementierungsdetails offenbart, keine öffentliche Codebasis. Was Anthropic intern plant und wie
es Entscheidungen trifft, bleibt Anthropics Sache.
Was man bekommt, ist allerdings ein interessantes Binary. Claude Code ist eine Bun Standalone Executable : Bun kompiliert JavaScript-Code nicht wirklich in Maschinencode, sondern bettet das komplette JavaScript-Bundle als Daten direkt ein. Der Bun-Runtime-Teil des Binaries entpackt und führt dieses Bundle beim Start aus. Konsequenz: Der gesamte "Quellcode" von Claude Code steckt als lesbarer Text im Binary — eingefroren, aber faktisch einsehbar. Proprietär, aber unverschlüsselt. Security through obscurity gibt es hier nicht — Bun hebelt es durch sein eigenes Packaging-Konzept aus.
Das kann man mit einem einfachen Blick bestätigen:
head -3 ~/.local/share/claude/versions/2.1.162
# ELF>... → natives Binary, kein Script
ELF — das ist das Format nativer Linux-Binaries. Kein Shebang, kein #!/usr/bin/env node
, kein lesbarer JavaScript-Anfang. Das erklärt auch warum die Umgebungsvariablen nichts bewirkten — nicht,
weil ein ELF-Binary grundsätzlich keine
LANG
-Variable liest (das tun native Binaries durchaus, sofern sie glibc nutzen), sondern weil die Bun-Runtime oder
das interne Clipboard-Modul von Claude Code diese Variable für diesen spezifischen Codepath schlicht
ignoriert. Der Clipboard-Mechanismus schaltet intern auf Windows/WSL-Erkennung — und das passiert unabhängig
von Locale-Einstellungen.
Aber weil das Bundle eingebettet ist, lässt sich trotzdem hineinsehen. Normalerweise würde man strings
benutzen, um lesbare Texte aus einem Binary zu extrahieren. Auf meiner frischen Distro war es nicht
installiert:
strings ~/.local/share/claude/versions/2.1.162
# bash: command not found: strings
Kein Problem. tr und grep sind immer da:
cat ~/.local/share/claude/versions/2.1.162 | tr -cd '[:print:]\n' | \
grep -i "clipboard\|powershell\|Set-Clipboard" | head -20
Ich hatte zu diesem Zeitpunkt bereits eine Vermutung, wohin die Suche führt — denn der CHANGELOG von Claude Code 2.1.70 war eindeutig:
Fixed clipboard corrupting non-ASCII text (CJK, emoji) on Windows/WSL
by using PowerShell Set-Clipboard
PowerShell also. Aber wie genau ? Das steht im CHANGELOG nicht. Und genau das wollte ich wissen — denn ohne die genauen Befehle zu kennen, kann man keinen Ersatz bauen.
Was dann aus dem Binary kam, war zunächst überwältigend: mehrere Megabyte eingebetteten JavaScript-Codes, komplett mit Kommentaren, Variablennamen, String-Literalen — der gesamte Quellcode von Claude Code, ungefiltert durch ein Terminal gejagt. UI-Strings, interne Fehlermeldungen, HTTP-Header, WebAssembly-Typen, CSS-Klassen, interne Konstanten. Das Binary von Claude Code ist ein kleines Universum.
Aber inmitten dieses Rauschens — zwei Zeilen, die alles präzisierten:
[Console]::InputEncoding = [Text.Encoding]::UTF8; Set-Clipboard -Value ([Console]::In.ReadToEnd())
[Console]::OutputEncoding = [Text.Encoding]::UTF8; Get-Clipboard -Raw
Das sind die exakten PowerShell-Befehle. Mit explizitem UTF-8-Encoding. Direkt ins Binary eingebettet. Nirgendwo in der offiziellen Dokumentation erwähnt — nur hier, im eingebetteten Bundle, wenn man weiß wo man suchen muss.
Das ist der Moment, wo sich alles vollständig fügte. Claude Code delegiert das Encoding-Problem an PowerShell:
es ruft
powershell.exe auf, weist PowerShell an [Console]::InputEncoding auf UTF-8 zu setzen, bevor es in die Zwischenablage schreibt, und [Console]::OutputEncoding
auf UTF-8 bevor es daraus liest. PowerShell ist der UTF-8-fähige Mittelsmann. Das ist ein eleganter Fix — für
alle die
powershell.exe im PATH haben.
Warum überhaupt PowerShell?
Eine berechtigte Frage. Claude Code läuft schließlich nicht nur in der WSL — es gibt auch native
Linux-Installationen, auf denen
powershell.exe
nie vorhanden sein wird. Der CHANGELOG und das Binary legen nahe: Der PowerShell-Codepath ist spezifisch für
Windows- und WSL-Umgebungen gedacht, wo PowerShell üblicherweise verfügbar ist. Auf nativem Linux greift
vermutlich ein anderer Codepath — das Binary enthielt in der Grep-Ausgabe auch Hinweise auf
xclip und xsel
. Wie genau Claude Code entscheidet, welchen Pfad es nimmt, lässt sich aus dem eingebetteten Bundle zwar
prinzipiell herauslesen — aber das war nicht Ziel dieser Debugging-Session. Was ich weiß: In meiner
abgeschotteten WSL2 landete es beim PowerShell-Pfad, fand kein
powershell.exe — und scheiterte.
Die Welt der Standard-WSL2-Nutzer: alles funktioniert, niemand weiß warum, niemand muss es wissen.
Meine Welt: powershell.exe
nicht gefunden — weil meine WSL2 abgeschottet ist und Windows-Binaries schlicht nicht existieren. Fallback.
Mojibake.
Damit hatte ich das Problem zwar nicht gelöst — aber seine Ursache vollständig und präzise verstanden. Das ist oft der wertvollere Schritt.
Die Lösung: Alles außer Kompromiss
Ich hätte natürlich Interop aktivieren können. enabled = true, appendWindowsPath = true, /mnt/c gemountet, powershell.exe im PATH — fertig. Drei Minuten Arbeit, Bug weg.
Aber das wäre der falsche Weg gewesen. Jedenfalls für mich. Nicht weil es nicht funktioniert hätte, sondern weil es die Sicherheitsgrenze aufgehoben hätte, die ich bewusst gezogen habe. Einen Bug in einem Werkzeug zu beheben indem man die eigene Sicherheitsarchitektur opfert — das ist kein Fix, das ist Kapitulation!
Also: Was braucht Claude Code? Es braucht powershell.exe im PATH, das zwei spezifische Befehle versteht:
Set-Clipboard -Value (...) # Text in Clipboard schreiben
Get-Clipboard -Raw # Text aus Clipboard lesen
Was wenn powershell.exe im PATH liegt — aber gar kein PowerShell ist?
Das ist der Gedanke, der alles veränderte. Und für seine Umsetzung brauchte ich einen Clipboard-Mechanismus, der vollständig innerhalb der WSL2-Sandbox funktioniert — ohne jeden Windows-Zugriff. Genau hier kam eine Entdeckung ins Spiel, die mich selbst überraschte.
WSLg: Der stille Mitspieler
echo $WAYLAND_DISPLAY
# wayland-0
Wayland läuft — obwohl ich keine GUI-Pakete installiert habe, obwohl die Distro frisch aufgesetzt ist, obwohl nirgendwo ein Desktop-Environment konfiguriert ist. Woher kommt das?
WSLg
: Windows Subsystem for Linux GUI. Seit Windows 11 ist WSLg fester Bestandteil von WSL2 und startet
automatisch mit jeder WSL2-Instanz. Es stellt einen vollständigen Wayland-Compositor und einen X-Server bereit
— nicht als optionales Feature, sondern als stille Infrastruktur im Hintergrund. Das
$WAYLAND_DISPLAY=wayland-0 kommt von Windows, nicht von Debian. Die Distro erbt es, ohne etwas dafür tun zu müssen.
Das bedeutet: wl-copy und wl-paste aus dem wl-clipboard
-Paket können diesen Wayland-Socket direkt nutzen. Kein eigener Compositor, keine X11-Konfiguration, keine
weiteren Abhängigkeiten. Einfach installieren und verwenden:
sudo apt install wl-clipboard
Damit hatte ich alle Zutaten beisammen: einen Clipboard-Mechanismus der vollständig in Linux lebt, und die Erkenntnis, was Claude Code genau erwartet. Zeit für das Script!
Das Script: Acht Zeilen, die alles lösen
Ich möchte kurz innehalten und den Kern des Gedankens explizit machen, bevor ich das Script zeige. Denn er ist — finde ich — von einer kleinen, stillen Eleganz, die sich nicht sofort erschließt.
Claude Code sucht powershell.exe
im PATH. Es ruft dieses Binary mit zwei spezifischen Befehlen auf. Es erwartet keine bestimmte
PowerShell-Version, keine bestimmte Windows-Integration, keinen bestimmten Ursprung des Binaries. Es erwartet
nur: ein Programm namens
powershell.exe, das Set-Clipboard und Get-Clipboard versteht.
Was wenn dieses Programm aus acht Zeilen Bash besteht?
Da /usr/local/bin root gehört, brauchen wir sudo tee statt cat > — sonst scheitert das Schreiben mit "Keine Berechtigung":
sudo tee /usr/local/bin/powershell.exe << 'EOF'
#!/bin/bash
if [[ "$*" == *"Set-Clipboard"* ]]; then
cat | wl-copy
elif [[ "$*" == *"Get-Clipboard"* ]]; then
wl-paste --no-newline # LF statt CRLF — Claude Code ist hier tolerant
fi
EOF
sudo chmod +x /usr/local/bin/powershell.exe
Das ist alles. Ein Bash-Script, das auf powershell.exe hört, das die zwei Befehle erkennt, die Claude Code aufruft, und das sie auf wl-copy und wl-paste
umleitet. Kein PowerShell. Kein Windows. Keine Interop. Keine Sicherheitsgrenze die auch nur einen Millimeter
verschoben wird.
Eine kurze technische Anmerkung zur Robustheit: Das Script matcht mit "$*" — alle übergebenen Argumente als ein String — auf die Substrings Set-Clipboard und Get-Clipboard
. Diese exakten Strings haben wir direkt aus dem eingebetteten Bundle extrahiert. Claude Code übergibt sie so,
unabhängig von zusätzlichen Flags wie
-NoProfile oder -NonInteractive
— der Substring-Match greift in jedem Fall. Wir matchen nicht auf die genaue Reihenfolge oder das exakte
Quoting, sondern auf das, was Claude Code garantiert mitschickt.
Ein theoretisches Restrisiko bleibt: wl-paste
liefert Unix-Zeilenenden (LF), echtes PowerShell auf Windows würde CRLF liefern. In der Praxis ist Claude Code
hier tolerant — der Test zeigt kein Problem. Sollte Anthropic das interne Parsing jemals verschärfen, wäre das
die einzige Sollbruchstelle.
Claude Code ruft powershell.exe
auf — und bekommt Bash. Es weiß es nicht. Es muss es nicht wissen. Die Schnittstelle ist erfüllt, das Ergebnis
ist korrekt, alle sind glücklich.
Wer es präzise benennen möchte: Das ist das Unix-Philosophie-Prinzip in Reinform — ein Programm muss nichts
über seinen Aufrufer wissen, nur über seine Schnittstelle. Oder, für die objektorientiert denkenden unter uns:
Dependency Injection auf Shell-Ebene. Claude Code hat eine Abhängigkeit (
powershell.exe
), wir injizieren unsere eigene Implementierung — und Claude Code merkt es nicht, weil es nur die
Schnittstelle kennt, nicht die Implementierung.
Streng genommen ist das kein Duck Typing — Duck Typing beschreibt Typsysteme in dynamischen
Programmiersprachen. Aber die Idee ist dieselbe, und ich finde sie zu schön, um sie nicht zu erwähnen: Wenn es
läuft wie eine Ente und quakt wie eine Ente, fragt niemand nach dem Ausweis. Claude Code fragt auch nicht.
Mein
powershell.exe quakt Set-Clipboard und Get-Clipboard — das reicht vollkommen.
Der Test
echo "🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯" | /usr/local/bin/powershell.exe -Command "Set-Clipboard"
/usr/local/bin/powershell.exe -Command "Get-Clipboard -Raw"
# → 🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯 ✓
Und in Claude Code: Umlaute tippen, mit der Maus markieren, Rechtsklick → Einfügen:
🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯
Korrekt. Vollständig. Ohne Kompromiss.
Ich gebe zu: in diesem Moment musste ich ausgiebig — und äußerst zufrieden — grinsen. Nach einer Stunde VS Code-Debugging, nach dem langen Weg durch Locale-Konfiguration, Terminal-Encoding, Binary-Analyse und PowerShell-Codepath-Archäologie — die Lösung sind acht Zeilen Bash. Das ist Softwareentwicklung in ihrer reinsten Form: ein Problem verstehen, eine minimale Lösung finden, fertig. 😉
Die Verifikation: Wirklich noch abgeschottet?
Zur Sicherheit: Drei unabhängige Checks bestätigen, dass die Abschottung vollständig erhalten ist.
# Kernel-Interface: Interop aktiv?
cat /proc/sys/fs/binfmt_misc/WSLInterop
# → inaktiv
# Windows-Laufwerk gemountet?
ls -la /mnt/c
# → leeres Verzeichnis
# Welches powershell.exe?
which powershell.exe
# → /usr/local/bin/powershell.exe
Claude Code weiß nicht, dass sein powershell.exe
in Wirklichkeit Bash ist. Es ist ihm egal. Die Zwischenablage funktioniert, der Wayland-Socket funktioniert,
Claude Code funktioniert. Alles innerhalb der WSL2-Sandbox, alles ohne ein einziges Byte Zugriff auf das
Windows-Dateisystem.
Was das über Abschottung lehrt
Es gibt eine Beobachtung, die ich aus diesem ganzen Debugging-Prozess mitgenommen habe, die über den konkreten Bug hinausgeht.
Die Abschottung hat den Bug nicht verursacht. Der Bug existierte unabhängig davon — in jedem WSL2-Setup, wo
powershell.exe aus irgendeinem Grund nicht verfügbar ist. Die Abschottung hat ihn lediglich sichtbar
gemacht. In den meisten WSL2-Setups mit aktivierter Interop läuft der PowerShell-Fix von Claude Code 2.1.70
still und unbemerkt im Hintergrund. Niemand weiß davon, niemand muss davon wissen, es funktioniert einfach.
Für mich funktionierte es nicht, weil mein Setup strenger ist als das, was Claude Code erwartet. Und weil ich, statt das Setup zu lockern, verstanden habe warum es nicht funktioniert — und eine Lösung gefunden habe, die das Setup respektiert.
Das ist, im Kern, der Wert von bewusster Konfiguration. Nicht als Selbstzweck, nicht als philosophische Übung — sondern weil man nur debuggen kann was man versteht. Wer seine Umgebung nicht kennt, kann ihre Fehler nicht lösen.
Ein Wort zur Ehrlichkeit in Sachen Sicherheit: Die Deaktivierung von Interop ist keine absolute
Sicherheitsgrenze — sie ist eine sinnvolle Reduktion der Angriffsfläche. Schadsoftware in der WSL kann
weiterhin Netzwerkverbindungen aufbauen und Daten exfiltrieren, die innerhalb der Sandbox liegen. Und der
Wayland-Socket, den wir hier nutzen, ist tatsächlich ein neuer, schmaler Vektor: Schadsoftware in der WSL
könnte theoretisch via
wl-paste
die Zwischenablage auslesen — inklusive Windows-Inhalte, die dort zwischengelagert sind. Das ist keine
Paranoia, das ist eine reale Abwägung. Wer regelmäßig sensible Daten wie Passwörter über die Zwischenablage
bewegt, sollte das im Hinterkopf behalten. Für meinen Use Case ist die Entscheidung klar: der Nutzen überwiegt
das Risiko deutlich — aber ich wollte es nicht unerwähnt lassen.
Ein letzter praktischer Hinweis: Dieser Fix gilt für alle WSL2-Versionen von Claude Code die den
PowerShell-Clipboard-Pfad verwenden — solange Anthropic das nicht ändert. Nach einem
claude update lohnt sich ein kurzer Check:
which powershell.exe
# Sollte zeigen: /usr/local/bin/powershell.exe
Solange das eigene Script an erster Stelle im PATH steht, ist alles in Ordnung. Falls Claude Code jemals einen
eigenen
wl-clipboard-Codepath bekommt, kann das Script einfach entfernt werden — es hat keine Seiteneffekte.
Reproduzierbarkeit und Übertragbarkeit
Die Lösung funktioniert identisch auf Debian und Ubuntu unter WSL2 — vorausgesetzt Windows 11 ist der Host
(WSLg ist Voraussetzung für Wayland) und
wl-clipboard ist installiert.
Kurz zusammengefasst sind es drei Schritte: sudo apt install wl-clipboard
, das Script aus dem vorherigen Abschnitt anlegen, testen. Wer eine direkte Copy-Paste-Vorlage möchte, findet
alles nochmals gesammelt im Appendix.
Wer nicht abschottet — also interop enabled = true und Windows-PATH eingebunden hat — braucht das alles nicht. powershell.exe ist dann direkt verfügbar, Claude Codes eigener Fix greift, alles funktioniert ohne Zutun.
Dieser Artikel ist für die anderen: die, die wissen, warum sie abschotten, und die dafür nicht auf funktionierende Umlaute verzichten wollen.
Appendix: Copy-Paste-Vorlage
Für alle, die direkt loslegen wollen — die vollständige Anleitung in einem Block:
# 1. Abhängigkeit installieren
sudo apt install wl-clipboard
# 2. Fake-powershell.exe anlegen
# (/usr/local/bin gehört root, daher sudo tee statt cat >)
sudo tee /usr/local/bin/powershell.exe << 'EOF'
#!/bin/bash
if [[ "$*" == *"Set-Clipboard"* ]]; then
cat | wl-copy
elif [[ "$*" == *"Get-Clipboard"* ]]; then
wl-paste --no-newline # LF statt CRLF — Claude Code ist hier tolerant
fi
EOF
sudo chmod +x /usr/local/bin/powershell.exe
# 3. Testen
echo "🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯" | /usr/local/bin/powershell.exe -Command "Set-Clipboard"
/usr/local/bin/powershell.exe -Command "Get-Clipboard -Raw"
# Erwartete Ausgabe: 🔥 Neues aus der verrückten Hölle der Zeichensätze! 🤯
# 4. Abschottung verifizieren
cat /proc/sys/fs/binfmt_misc/WSLInterop # → inaktiv
ls -la /mnt/c # → leer
which powershell.exe # → /usr/local/bin/powershell.exe
WSL-Konfiguration (vollständige Abschottung)
/etc/wsl.conf:
[boot]
systemd=true
command = mount --make-rshared /
[automount]
enabled = false
mountFsTab = true
[interop]
enabled = false
appendWindowsPath = false
Danach: wsl --shutdown → WSL neu starten.
Was Claude Code intern aufruft
Zur Referenz — die exakten PowerShell-Befehle, die Claude Code verwendet und die unser Script abfängt:
# Clipboard setzen:
[Console]::InputEncoding = [Text.Encoding]::UTF8; Set-Clipboard -Value ([Console]::In.ReadToEnd())
# Clipboard lesen:
[Console]::OutputEncoding = [Text.Encoding]::UTF8; Get-Clipboard -Raw
Voraussetzungen: WSL2, Windows 11 (WSLg für Wayland), Debian oder Ubuntu. Nach einem claude update kurz prüfen ob which powershell.exe noch auf das eigene Script zeigt.