Existe-t-il un équivalent de ssh-copy-id pour Windows?

56

Existe-t-il un équivalent ou un port de ssh-copy-id disponible pour Windows? Autrement dit, existe-t-il un moyen simple de transférer les clés SSH d'un ordinateur local vers un serveur distant sous Windows?

Si cela peut aider, j'utilise déjà Pageant et Kitty (une alternative Putty).

Matt V.
la source

Réponses:

27

ssh-copy-id est un script assez simple qui devrait être assez facile à répliquer sous Windows.

Si vous ignorez la gestion des paramètres, des erreurs, etc., ce sont les deux commandes de ssh-copy-id qui effectuent le travail la plupart du temps.

GET_ID="cat ${ID_FILE}"
{ eval "$GET_ID" ; } | ssh ${1%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

En utilisant les outils de mastic, une commande comme celle-ci devrait être équivalente (non testée).

type  public_id | plink.exe username@hostname "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys"

Si vous voulez gérer tous les mêmes erreurs, ainsi que l'emplacement de la clé automatique, écrire un script sous Windows sera beaucoup plus compliqué, mais certainement possible.

Zoredache
la source
1
Merci! Je ne pouvais pas le faire fonctionner au début; J'obtenais des erreurs "d'accès refusé", mais plink n'arrêtait pas pour me permettre de saisir le mot de passe. J'ai ensuite essayé de transmettre Plink le mot de passe en utilisant le commutateur -pw et cela a fonctionné. Savez-vous s’il existe un moyen d’obtenir une pause de la part de plink pour que vous puissiez entrer le mot de passe au milieu?
Matt V.
Pas vraiment sûr de l'authentification par mot de passe et de plink. Chaque fois que je l'utilise, j'ai déjà ma clé sur le système et pagent est en cours d'exécution.
Zoredache
4
plink.exe -pw passwordtravaux. De plus, si vous savez que .ssh / registered_keys existe, la commande est simplementtype id_rsa.pub | plink.exe -ssh user@host -pw password "cat >> .ssh/authorized_keys"
KCD
@KCD Il suffit que le .ssh/répertoire existe. La >>redirection créera alors le fichier s'il n'existe pas.
Pabouk
20

Ces réponses ne m'ont pas aidé. Je n'avais vraiment pas besoin de scripts fous. J'avais créé une clé publique sur ma machine cliente dans git bash et j'essayais de la copier sur un VPS.

Après avoir créé votre clé publique, la clé doit être stockée sous le nom "(quel que soit le dossier dans lequel vous avez commencé) /. Ssh / id_rsa.pub"

Utilisez donc cette commande:
cat ~/.ssh/id_rsa.pub | ssh [email protected] "cat >> ~/.ssh/authorized_keys"userest votre nom d'utilisateur (parfois "root", ou ce que vous avez configuré) et remplacez-la 123.45.67.89par l'adresse IP de votre machine / hôte / VPS.

Si le répertoire .sshn'est pas encore créé sur la machine hôte, utilisez cette petite variante:
cat ~/.ssh/id_rsa.pub | ssh [email protected] "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

Augie Gardner
la source
2
J'aimerais avoir plus de votes! Pour le one-liner!
patricktokeeffe
16

ssh-copy-id effectue plusieurs opérations (lisez la page de manuel pour plus de détails), mais la chose la plus importante à faire est d'ajouter le contenu de votre fichier de clé publique locale à un fichier distant appelé registered_keys.

  • Vous pouvez le faire vous-même en ouvrant le fichier de clés avec un éditeur de texte et en collant le contenu dans le terminal Kitty.
    echo 'long_line_with_contents_of_public_key_file' >> .ssh/authorized_keys

  • Alternativement, vous pouvez télécharger le fichier en utilisant WinSCP (qui utilise sftp ou scp comme solution de secours) et faire quelque chose de similaire à ma suggestion précédente, sans le copier / coller désagréable.
    cat id_rsa.pub >> .ssh/authorized_keys
    où id_rsa.pub est le nom du fichier de la clé publique que vous avez téléchargée.

Kenny Rasschaert
la source
5

Inspiré par la réponse de zoredache, j'ai créé un ensemble de scripts qui constituent la version Windows. Cependant, ils dépendent tous de plink. S'il vous plaît jeter un oeil ici

https://github.com/VijayS1/Scripts/blob/master/ssh-copy-id/

J'ai aussi un script Winscp qui peut être utilisé selon une autre réponse. :) Extrait du readme:

Tentative de méthodes jusqu'à présent:

  • DOS (.cmd) - Succès
  • VBS (.vbs) - Succès
  • Powershell (.ps1) - Succès
  • mremoteNG (ext app) - Succès
    • Sélectionnez hôte, clic droit, outils externes, sélectionnez Nom du script
  • Script WinSCP (.bat) - Succès
    • # "WinSCP.com" /script=".\Scriptname" /parameter "user[:password]@example.com" "id_rsa.pub" [/log=".\copyssh.log]"
Vijay
la source
1
Ce sont assez doux
Pred
5

Dans Windows 7, il existe un ssh.exe

Voici ce qui a fonctionné pour moi:

1. créer une identité (sur Windows)

c:\>ssh-keygen

Cela a créé un fichier d'identité dans le répertoire de base. J'ai changé le nom de la clé publique en "id_rsa"

2. Copiez le fichier sur le système Linux cible à l'aide des crédits SSH à l' adresse https://serverfault.com/users/984/zoredache pour obtenir sa réponse.

c:\>ssh user@lnxhost "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1" < \\path_to_where_the_file_was_generated_from_ssh_key_gen\id_rsa.pub

Remarque: pour une raison quelconque, la tuyauterie n'a pas fonctionné pour moi:

# this should work but it didn't work for me 
type file | ssh user@lnxhost "cat >> /tmp/t.txt"

3. Corrigez le fichier sous linux Le fichier id_rsa.pub sous Windows contient plusieurs lignes, et linux l’attend dans une seule ligne. Nous devons donc le corriger un peu. Connectez-vous à linux et ouvrez le fichier:

vi ~/.ssh/authorized_keys

Par exemple:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, user@winhost"
AAAAB3NzaC1yc2EAAAABIwAAAQEAnvYlVooXGoj3+7huZBUqf4wj57r25SHCKiiShyla33
5flX7Rsmb4meExpdh2NzfzffG15xl1wo0xBZ3HdZdqF2GUniEcNbtVjS1FKzQwPfsYPHMC
Y58qT0U2ZgK1zsXj2o0D2RWrCv3DFFfwUgNyZRYN2HK32umY6OmGSOVuJvIKhT+X6YaCVy
ax3CHv2ByB2OTBl9mh4nrwYAVXToT+X2psBE+MKB5R85lrUGkl3GtymTk10Dvf5O80exdT
LFRMvkCA5RAIZgvxMk/bbNaH/0UHQoctX9oaDeKGWUPfVaknFBQdU9009+lK/ocAlKVNHE
Qkw+1wuV6dFoT1/hngSw==
---- END SSH2 PUBLIC KEY ----

devraient devenir

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnvYlVooXGoj3+7huZBUqf4wj57r25SHCKiiShyla335flX7Rsmb4meExpdh2NzfzffG15xl1wo0xBZ3HdZdqF2GUniEcNbtVjS1FKzQwPfsYPHMCY58qT0U2ZgK1zsXj2o0D2RWrCv3DFFfwUgNyZRYN2HK32umY6OmGSOVuJvIKhT+X6YaCVyax3CHv2ByB2OTBl9mh4nrwYAVXToT+X2psBE+MKB5R85lrUGkl3GtymTk10Dvf5O80exdTLFRMvkCA5RAIZgvxMk/bbNaH/0UHQoctX9oaDeKGWUPfVaknFBQdU9009+lK/ocAlKVNHEQkw+1wuV6dFoT1/hngSw== user@winhost

4. le tester

c:\>ssh user@lnxhost "ls -al /tmp/"

Cela devrait lister le contenu de / tmp sans demander le mot de passe.

Deian
la source
1
👍 pour l'étape 3. Il ne authorized_keysme fallait que le reformatage en lignes simples!
patricktokeeffe
heureux cela vous a aidé - jusqu'à voter, la réponse :)
Deian
5

Si vous n'avez pas ssh-copy-idWindows, vous pouvez l'exécuter sur le serveur lui-même.

  • Dans PuTTYgen, chargez votre clé privée (.ppk);
  • Copiez le contenu de la boîte Clé publique pour la coller dans le fichier OpenSSH registered_keys dans un presse-papiers.
  • Collez-le dans votre éditeur préféré (le Bloc-notes Windows fera l'affaire).
  • Enregistrez le contenu dans un fichier avec une .pubextension.
  • Téléchargez le .pubfichier sur le serveur.
  • Connectez-vous au serveur avec un client SSH, comme PuTTY.
  • Sur le type de serveur:

    ssh-copy-id -i mykey.pub username@localhost
    

Sous Windows, le ssh-copy-idscript est fourni avec Git pour Windows . Donc, vous pouvez l’utiliser localement, si vous avez Git pour Windows.


Si vous ne voulez pas le faire manuellement, vous pouvez utiliser WinSCP 5.15. Il peut configurer l'authentification par clé publique pour vous.
Utilisez le bouton Outils> Installer la clé publique sur le serveur dans la page SSH> Authentification de la boîte de dialogue Paramètres de site WinSCP Advanced .

entrez la description de l'image ici

(Je suis l'auteur de WinSCP)

Martin Prikryl
la source
Cela devrait être la réponse acceptée: git-bash pour Windows 7; Sous-système Linux disponible sous Windows 10
Alex
0

Si vous utilisez cmder (ou msysgit / mingw qui a scp & ssh), je viens d'écrire un script python simple pour cela. Vous pouvez le trouver ici: https://gist.github.com/ceilfors/fb6908dc8ac96e8fc983

Exemple d'utilisation: utilisateur python ssh-copy-id.py @ remote-machine.

Le mot de passe sera demandé lors de l'exécution du script.

ceilfors
la source
pourquoi cela nécessite-t-il cmder?
David Zorychta
@ user57411 Il ne nécessite pas cmder, il nécessite les commandes scp et ssh.
Ceilfors
0

ce que j'ai fait, avoir Cygwin sur ma Win10, me connecter à Linux (basé sur la réponse ci-dessus):

- remarque: avec cat, cela résoudrait automatiquement le chemin de cygwin, ainsi que toute commande de cygwin utilisant la structure cygwin-linux-folder-structure

1. added c:\cygwin\bin to the environment's Path variable
2. starting cmd.exe (windows commandline)
3. > ssh-keygen -t rsa   (just pressing enter till done)
4. > cat ~/.ssh/id_rsa.pub | ssh user@server "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys"
5. ..enter server password
6. > ssh user@server (testing, not beeing asked for password)
BananaAcid
la source
0

Les étapes suivantes suffiraient:

ÉTAPE-1: Générer une paire de clés RSA

C:\Users\user>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/user//.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/user//.ssh/id_rsa.
Your public key has been saved in /c/Users/user//.ssh/id_rsa.pub.
The key fingerprint is:
20:16:9b:0d:00:92:c4:34:99:51:20:b7:ef:50:c4:0f user@localhost

STE2-2: équivalent de ssh-copy-id dans Windows

C:\Users\user>ssh user@remote "umask 077; test -d .ssh || mkdir .ssh ; cat >> .s
sh/authorized_keys || exit 1" < "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys
 || exit 1" < C:\Users\user\.ssh\id_rsa.pub
The authenticity of host 'remote (xx.xx.xxx.xx)' can't be established.
RSA key fingerprint is 99:99:73:74:fe:14:bc:91:c8:3b:ac:f4:95:99:4d:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'remote,xx.xx.xxx.xx' (RSA) to the list of known hosts.
*************************************************************************
This computer system is the property of Sample Corporation and is to
be used for business purposes.  All information, messages, software and
hardware created, stored, accessed, received, or used by you through
this system is considered to be the sole property of Sample Corporation
and can and may be monitored, reviewed, and retained at any time.  You
should have no expectation that any such information, messages or
material will be private.  By accessing and using this computer, you
acknowledge and consent to such monitoring and information retrieval.
By accessing and using this computer, you also agree to comply with
all of Sample Company's policies and standards.
*************************************************************************
user@remote's password:[Enter Password for first time]

ÉTAPE 3: L'authentification sans mot de passe fonctionne!

C:\Users\user>ssh user@remote
*************************************************************************
This computer system is the property of Sample Corporation and is to
be used for business purposes.  All information, messages, software and
hardware created, stored, accessed, received, or used by you through
this system is considered to be the sole property of Sample Corporation
and can and may be monitored, reviewed, and retained at any time.  You
should have no expectation that any such information, messages or
material will be private.  By accessing and using this computer, you
acknowledge and consent to such monitoring and information retrieval.
By accessing and using this computer, you also agree to comply with
all of Sample Company's policies and standards.
*************************************************************************
Last login: Wed Oct 14 14:37:13 2015 from localhost
GANESH
la source
0

Version Powershell pour SSH incluse dans Git For Windows

En fait, cela peut fonctionner aussi longtemps que vous avez sshsur votre chemin. Ajoutez ce qui suit dans votre profil powershell:

function ssh-copy-id([string]$userAtMachine){   
    $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"      
    }
}

Dans une console PowerShell:

ssh-copy-id user@machine
Fab
la source
ssh-copy-id n'est pas censé générer une clé si elle n'existe pas.
RalfFriedl
@RalfFriedl J'ai enlevé le keygen
Fab