ssh-copy-id unter Windows: der PowerShell-Befehl, der funktioniert

Windows hat kein ssh-copy-id. Führen Sie in PowerShell Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo >> ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" aus und geben Sie auf Nachfrage Ihr Passwort ein. Das funktioniert für einen Linux- oder Mac-Server. Ein Windows-Server braucht einen anderen Befehl.

Lieber ohne PowerShell-Anführungszeichen? Vom Mac, iPhone oder iPad aus installiert Wardterm einen öffentlichen Schlüssel direkt aus der Schlüsselliste auf einem Server. Zeigen

Aktualisiert am . Der Einzeiler lief in PowerShell 7.4 unter Linux gegen einen Ubuntu-24.04-Server, und die Sonderfälle der Datei (Zeilenenden, UTF-16, fehlender Zeilenumbruch) wurden gegen diesen Server getestet.

Einen Schlüssel auf einen Linux- oder Mac-Server kopieren

Führen Sie dies in PowerShell auf Ihrem Windows-Rechner aus:

Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo >> ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Sie geben das Kontopasswort einmal ein. Für einen anderen Port fügen Sie -p 2222 hinter ssh ein. Derselbe Befehl funktioniert in der Eingabeaufforderung, wenn Sie den ersten Teil durch type %USERPROFILE%\.ssh\id_ed25519.pub ersetzen.

Testen Sie es dann. Dieser Befehl weicht nicht auf ein Passwort aus und gelingt daher nur, wenn der Schlüssel funktioniert:

ssh -o PasswordAuthentication=no user@server

Noch keinen Schlüssel? Erstellen Sie zuerst einen, wie in SSH-Schlüssel unter Windows erzeugen beschrieben.

Warum diese Version

Die meisten Kopien dieses Befehls im Netz lassen den Teil mit echo >> weg. Er fügt zuerst eine leere Zeile ein, weil eine vorhandene authorized_keys nicht mit einem Zeilenumbruch enden muss. Ohne ihn klebt Ihr Schlüssel am Ende der letzten Zeile, und dieser Schlüssel und Ihrer funktionieren beide nicht mehr. In unserem Test wurde die Anmeldung in diesem Fall abgelehnt und funktionierte mit der leeren Zeile, die der Server ignoriert.

Drei weitere Dinge, die wir geprüft haben:

  • Windows-Zeilenenden. Ein Schlüssel mit CRLF dahinter funktionierte weiterhin, mit oder ohne Kommentar, unter OpenSSH 9.6.
  • UTF-16. Eine Datei in UTF-16 funktioniert nicht: Die Anmeldung wurde abgelehnt. In Windows PowerShell 5.1 schreiben > und >> UTF-16, erstellen Sie authorized_keys also nie damit. Add-Content und die Pipe oben haben bei einem einfachen Schlüssel dieses Problem nicht.
  • Wiederholen. Führen Sie den Befehl zweimal aus, wird der Schlüssel zweimal eingetragen. Das ist harmlos, aber ssh-copy-id hätte es übersprungen.

Wenn Sie Git Bash oder WSL haben

Das sind Unix-Umgebungen mit eigenen Werkzeugen. Prüfen Sie, ob der echte Befehl vorhanden ist:

command -v ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

Beachten Sie, dass WSL ein eigenes Home-Verzeichnis hat, sein ~/.ssh ist also nicht Ihr Windows-.ssh.

Einen Schlüssel auf einen Windows-Server kopieren

Der Einzeiler scheitert hier, denn die Standard-Shell ist cmd.exe und der Speicherort der Datei ist ein anderer. Am einfachsten arbeiten Sie auf dem Server selbst und fügen den Schlüssel ein, wie in der Anleitung zum OpenSSH-Server gezeigt.

Um es aus der Ferne zu tun, dokumentiert Microsoft Folgendes für einen Standardbenutzer:

$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"
ssh user@server $remotePowershell

Beachten Sie, dass $env:USERPROFILE in den doppelten Anführungszeichen auf Ihrem Rechner aufgelöst wird, bevor es gesendet wird. Es landet nur am richtigen Ort, wenn der Profilpfad auf beiden derselbe ist, prüfen Sie also das Ergebnis.

Für ein Mitglied der Administratoren kommt der Schlüssel in eine andere Datei mit strengen Rechten:

$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '$authorizedKey';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""
ssh user@server $remotePowershell

Wenn die Anmeldung weiter nach einem Passwort fragt

Unter Linux sehen Sie sich das Log des Servers an, während Sie es versuchen: Rechte am Home-Verzeichnis, an ~/.ssh und an authorized_keys sind die übliche Ursache. Siehe Permission denied (publickey). Prüfen Sie bei einem Windows-Server zuerst, ob das Konto ein Administrator ist und ob Sie die passende Datei verwendet haben.

Fragen

Gibt es ssh-copy-id für Windows?

Nicht im OpenSSH-Client, der mit Windows kommt. Git Bash oder WSL haben den echten Befehl eventuell; prüfen Sie es mit command -v ssh-copy-id. In PowerShell leiten Sie den öffentlichen Schlüssel stattdessen per Pipe an ssh.

Warum fragt der Server nach dem Kopieren des Schlüssels immer noch nach dem Passwort?

Meist wegen der Rechte auf dem Server: Home-Verzeichnis, ~/.ssh und authorized_keys dürfen für andere nicht beschreibbar sein. Ein Schlüssel in UTF-16 oder einer, der an der vorigen Zeile klebt, scheitert ebenfalls. Beobachten Sie beim Versuch das Log des Servers.

Wo liegt der öffentliche Schlüssel auf einem Windows-Server?

Für normale Benutzer in .ssh\authorized_keys im Benutzerprofil. Für Mitglieder von Administrators in C:\ProgramData\ssh\administrators_authorized_keys, lesbar nur für Administrators und SYSTEM.

Quellen

Mehr zu SSH auf jedem System

Alle Anleitungen