Copiare una chiave su un server Linux o Mac
Esegui questo in PowerShell sulla tua macchina Windows:
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"
Digiti la password dell'account una volta. Per un'altra porta, aggiungi -p 2222 dopo ssh. Lo stesso comando funziona nel Prompt dei comandi se sostituisci la prima parte con type %USERPROFILE%\.ssh\id_ed25519.pub.
Poi provalo. Questo rifiuta di ripiegare sulla password, quindi riesce solo se la chiave funziona:
ssh -o PasswordAuthentication=no user@server
Non hai ancora una chiave? Creala prima, come spiegato in come generare una chiave SSH su Windows.
Perché questa versione
La maggior parte delle copie di questo comando online salta la parte echo >>. Aggiunge prima una riga vuota, perché un authorized_keys esistente potrebbe non finire con un newline. Senza, la tua chiave si incolla alla fine dell'ultima riga, e quella chiave e la tua smettono entrambe di funzionare. Nella nostra prova il login veniva rifiutato in quel caso e funzionava con la riga vuota, che il server ignora.
Altre tre cose che abbiamo verificato:
- Fine riga di Windows. Una chiave seguita da CRLF funzionava comunque, con o senza commento, su OpenSSH 9.6.
- UTF-16. Un file in UTF-16 non funziona: il login è stato rifiutato. In Windows PowerShell 5.1,
>e>>scrivono in UTF-16, quindi non creare maiauthorized_keyscon loro.Add-Contente la pipe qui sopra non hanno questo problema per una chiave semplice. - Ripetizione. Eseguire il comando due volte aggiunge la chiave due volte. È innocuo, ma
ssh-copy-idl'avrebbe saltata.
Se hai Git Bash o WSL
Sono ambienti Unix con i loro strumenti. Controlla se il comando vero è presente:
command -v ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
Ricorda che WSL ha una propria cartella home, quindi il suo ~/.ssh non è il tuo .ssh di Windows.
Copiare una chiave su un server Windows
La riga unica qui fallisce, perché la shell predefinita è cmd.exe e la posizione del file è diversa. Il modo più semplice è lavorare sul server stesso e incollare la chiave, come mostra la guida a OpenSSH Server.
Per farlo da remoto, Microsoft documenta questo per un utente standard:
$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
Nota che $env:USERPROFILE dentro le virgolette doppie viene sostituito sulla tua macchina, prima dell'invio. Finisce nel posto giusto solo se il percorso del profilo è lo stesso su entrambe, quindi controlla il risultato.
Per un membro di Administrators, la chiave va in un file diverso con permessi rigorosi:
$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
Se il login chiede ancora la password
Su Linux, guarda il log del server mentre provi: i permessi sulla cartella home, su ~/.ssh e su authorized_keys sono la causa abituale. Vedi Permission denied (publickey). Su un server Windows, controlla prima se l'account è un amministratore e se hai usato il file corrispondente.
Domande
Esiste ssh-copy-id per Windows?
Non nel client OpenSSH incluso in Windows. Git Bash o WSL possono avere il comando vero: controlla con command -v ssh-copy-id. In PowerShell passa invece la chiave pubblica a ssh con una pipe.
Perché il server chiede ancora la password dopo che ho copiato la chiave?
Di solito per i permessi sul server: la home, ~/.ssh e authorized_keys non devono essere scrivibili da altri. Anche una chiave salvata in UTF-16 o attaccata alla riga precedente non funziona. Guarda il log del server mentre provi.
Dove va la chiave pubblica su un server Windows?
Per un utente normale in .ssh\authorized_keys nel profilo dell'utente. Per un membro di Administrators in C:\ProgramData\ssh\administrators_authorized_keys, leggibile solo da Administrators e SYSTEM.
Fonti
- Autenticazione con chiavi in OpenSSH per Windows, Microsoft Learn
- about_Character_Encoding, Microsoft Learn
- ssh-copy-id(1), Debian 13