web-dev-qa-db-fra.com

Putty ne mettra pas en cache les clés pour accéder à un serveur lors de l'exécution du script dans Hudson

J'avais un processus d'automatisation simple à écrire qui nécessitait de copier quelques fichiers du serveur Linux vers Windows via SSH. Ceci peut être accompli en utilisant PuTTY.

SSH, dans le cadre du protocole, vérifie l’identité de l’hôte et, s’il n’est pas reconnu comme étant correct, vous invitera à accepter l’identité de l’hôte. Lorsque je connecte manuellement le serveur Linux à PuTTY, aucune information n’est invitée à accepter l’identité de l’hôte. Mais une fois que j'ai mis ce processus d'automatisation dans Hudson en tant que travail programmé. Le message exact était:

La clé de l'hôte du serveur n'est pas mise en cache dans le registre. Vous n'avez pas Assurez-vous que le serveur est l'ordinateur que vous croyez. Le L’empreinte digitale de la clé rsa2 du serveur est la suivante: ssh-rsa 1024 cc: 78: 13: a3: 68: a6: 59: 7e: b8: 23: 2d: 13: 3e: 66: 9b: b9 Si vous avez confiance en cela Hôte, entrez "y" pour ajouter la clé au cache de PuTTY et continuer de liaison. Si vous voulez continuer à vous connecter une seule fois, sans en ajoutant la clé au cache, entrez "n". Si vous ne faites pas confiance à cet hôte, appuyez sur Retour pour abandonner la connexion. Stocker la clé dans le cache? (y/n) Connexion abandonnée.

Habituellement, vous frappez «Y» ici, en supposant que la clé Host est correcte, afin de la stocker dans une connexion future. Le stockage de ceci va dans le registre sous HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys

Mais malheureusement, le processus d'automatisation exécuté dans Hudson ne peut pas effectuer d'interaction en appuyant sur «Y» pour stocker la clé de l'hôte dans le cache PuTTY. De plus, je ne peux pas reproduire le problème en exécutant simplement le processus d’automatisation sous la commande DOS.

Est-ce que quelqu'un sait comment résoudre le problème?

32
Charlotte Xu
echo y | pscp -i /path/to/key/file user@remote:/tmp/file  .
echo y | plink -i /path/to/key/file scripts.sh

il stockera l'empreinte digitale de la clé de l'hôte à l'emplacement suivant la première fois et ignorera la prochaine fois

HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
34
Jay

Pour les serveurs internes, le tour aveugle echo y | ... est probablement suffisant (et super simple).

Cependant, pour les serveurs externes accédés sur Internet, il est beaucoup plus sûr d’accepter la clé hôte du serveur une fois que de l’accepter aveuglément à chaque fois.


Créez un fichier .reg que vous pouvez exécuter sur le ou les ordinateurs clients.

  • Connectez-vous de manière interactive depuis n'importe quel ordinateur plink ...
  • Vérifier et accepter la clé de l'hôte
  • Ouvrir regedit
  • Accédez à HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
  • Cliquez avec le bouton droit sur l'entrée (son nom sera comme rsa2@<port>:<address>).
  • Exporter vers un fichier .reg

Mettre en cache la clé de l'hôte sur les ordinateurs clients

  • Exécutez le fichier .reg sur n'importe quel ordinateur client pouvant se connecter à ce serveur.
  • Assurez-vous de vous connecter en utilisant le compte d’utilisateur qui exécutera plink (c’est-à-dire s’il s’agit d’un compte de service).
16
Clay

J'ai également eu ce problème lors de l'utilisation d'un planificateur de lot utilisant le compte système local. Avec ce compte, vous ne pouvez pas vous connecter pour accepter la clé d'hôte ou définir manuellement la valeur HKEY_CURRENT_USER . J'ai constaté que la création de la clé suivante:

HKEY_USERS\.DEFAULT\Software\SimonTatham\PuTTY\SshHostkeys

et l’ajout de la valeur de chaîne d’hôte utilisée ici pour le compte Système local.

15
Toby Vinnell

À compter du 9 septembre 2014, avec la version correspondante de plink (testée avec plink 0.66), vous pouvez utiliser l'option -hostkey, comme indiqué ici:

http://www.chiark.greenend.org.uk/~sgtatham/PuTTY/wishlist/accept-Host-keys.html

En utilisant la clé dans la question initiale:

plink -hostkey cc:78:13:a3:68:a6:59:7e:b8:23:2d:13:3e:66:9b:b9 user@remote 

J'ai utilisé avec succès "-hostkey" dans mes scripts pour contourner le problème d'invite de clé d'hôte initial.

"-hostkey" est également documenté pour fonctionner avec pscp (version 0.66).

Notez que vous devez modifier la clé d'hôte si vous modifiez des hôtes ou si le serveur sshd recalcule la clé.

8
Stephen Rondeau
echo y | plink -ssh <username@remotemachine> -pw <password> exit
plink -ssh <username@remotemachine> -pw <password> [yourcommand]

Explication: Si vous utilisez echo pour canaliser, l'utilisateur doit entrer "y" dans la commande sélectionnée, puis quitter . L'instruction suivante appelle ensuite l'exécutable plink une seconde fois pour exécuter votre commande.

5
Sumit Gupta

J'avais ce problème lorsque j'utilisais Bazaar et que je réglais manuellement mon client ssh de manière à ce qu'il soit PuTTY plutôt que le paramiko intégré, et que j'obtenais exactement le même problème, où il essayait de dire que la clé n'était pas dans 'hôtes connus' et me demandant si je devrais le vérifier, mais étant donné qu'il est exécuté par un programme différent et non dans un terminal normal, il est juste sorti immédiatement. 

Si vous le pouvez, exécutez simplement PuTTY et connectez-vous au serveur manuellement pour qu'il enregistre la clé publique ssh dans le registre. Ainsi, lorsque le programme automatisé tente de se connecter, l'option y/n ne lui est pas présentée.

Ou vous pouvez utiliser un petit script python3 que j'ai écrit pour convertir entre les deux formats d'hôte connus que PuTTY et openssh utilisent: https://github.com/mgrandi/openssh-PuTTY-knownhost-converter

`

4
mgrandi

Exécuter en mode administrateur à partir de Windows PowerShell

pscp -i /path/to/private_key source_file user@ip:/home/location

Solution via code: Compilez PuTTY/plink pour accepter et stocker automatiquement les clés ssh

Vous êtes invité à stocker les clés de l'hôte SSH dans le cache. Comme le compte d'utilisateur exécute le plink, l'hôte ne figure pas dans le registre. Il se bloque car il attend la réponse (oui/non ..).
Si vous souhaitez résoudre ce problème via le code, obtenez le code source de PuTTY, apportez des modifications, compilez et utilisez le nouveau fichier binaire plink - celui qui stocke la clé d’hôte ssh sans l’invite.
Comment faire ? Pour les fenêtres, je fais ce qui suit: 

  • Téléchargez le dernier code source de PuTTY à l’adresse: https://www.chiark.greenend.org.uk/~sgtatham/PuTTY/latest.html
    (Recherchez la section "Code source" et téléchargez "Archive source Windows")
    Attention: pour ouvrir le code source de PuTTY avec Visual Studio, vous devez télécharger une version release. Si vous passez à un commit spécifique (ou en-tête), les fichiers de la solution Visual Studio n’existeront pas car ils sont créés pendant la construction.
    Tiré de: Impossible de compiler PuTTY, Plink ou Pscp sous Windows en raison du sous-répertoire Windows/MSVC manquant

  • Le code source doit être mis à jour. Ce que nous voulons changer est situé dans la fonction verify_ssh_Host_key (..) dans "wincons.c", Nous voulons commenter la partie du code qui invite pour oui/non et simplement stocker la clé, Démarrer avec commenter le code d'invite:

    /*hin = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(hin, &savemode);
    SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT |
             ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT));
    ReadFile(hin, line, sizeof(line) - 1, &i, NULL);
    SetConsoleMode(hin, savemode);
    
    if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') {
    if (line[0] == 'y' || line[0] == 'Y')
    store_Host_key(Host, port, keytype, keystr);
    return 1;
    } else {
      fprintf(stderr, abandoned);
      return 0;
    }*/  
    

Continuez en ajoutant les lignes suivantes à la place (code du responsable de la clé hôte): 

store_Host_key(Host, port, keytype, keystr);
return 1;

Compilez la solution et prenez plink/pscp .. vous êtes prêt à vous passer de Prompt, il accepte la clé d’hôte ssh et l’enregistre ensuite dans le registre.

0
ilansch