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 Sieauthorized_keysalso nie damit.Add-Contentund 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-idhä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
- Key-based authentication in OpenSSH for Windows, Microsoft Learn
- about_Character_Encoding, Microsoft Learn
- ssh-copy-id(1), Debian 13