1 votes

La commande "ssh-keyscan 192.168.1.X | ssh-keygen -lf -" ne fonctionne pas dans macOS "El Capitan"

Sous Linux et (Windows via gitbash), si la commande suivante est exécutée :

ssh-keyscan 192.168.1.X | ssh-keygen -lf -

Elle fonctionne comme prévu, mais sous macOS (El Capitan), cela génère une erreur :

-: Aucun fichier ou dossier de ce type
# 192.168.1.X SSH-2.0-OpenSSH .....
# 192.168.1.X SSH-2.0-OpenSSH .....
# 192.168.1.X SSH-2.0-OpenSSH .....

Comment résoudre ce problème?

Remarque La version de bash sur mon macOS est 3.2.57(1)-release et si je lance ssh -V, cela renvoie OpenSSH_6.9p1, LibreSSL 2.1.8

1voto

jaume Points 13186

La version d'OpenSSH incluse dans El Capitan ne prend pas en charge la lecture du fichier de clé à partir de l'entrée standard et selon vos tests, ne prend pas en charge la substitution de processus (ssh-keygen -lf <(ssh-keyscan 192.168.1.X) non plus.

Cela signifie que vous devrez d'abord enregistrer le fichier de clé puis le passer à ssh-keygen.

Vous pouvez utiliser:

  • une fonction (changez skg par un nom de votre choix):

    function skg() {
        if [[ $1 == "" ]]; then
            echo "$FUNCNAME: Spécifiez une adresse IP ou un nom d'hôte pour lire une clé SSH à partir de";
            return 1;
        else
            ip_address=$1;
        fi;
        tmp_file=$(mktemp);
        ssh-keyscan $ip_address > $tmp_file;
        ssh-keygen -lf $tmp_file
        rm $tmp_file
    }

    où:

    • mktemp est une commande qui crée un fichier temporaire avec un nom unique qui n'est lisible que par vous.
    • $FUNCNAME est une variable shell qui retourne le nom de la fonction

    Ajoutez la fonction à votre fichier .bashrc, ouvrez une fenêtre de terminal et exécutez-la comme suit:

    skg 192.168.1.X

  • une une ligner:

    ssh-keyscan 192.168.1.X > /tmp/keyfile; ssh-keygen -lf /tmp/keyfile; rm /tmp/keyfile

    (Notez que j'utilise ; pour séparer les commandes au lieu de && car ce dernier est un opérateur conditionnel, c'est-à-dire, dans une structure comme ceci: commandA && commandB, commandB ne sera exécuté que si commandA est réussie, ce qui pourrait empêcher la suppression du fichier temporaire dans la dernière étape en cas d'erreur. ;, d'autre part, est juste un séparateur de sorte que toutes les commandes sont exécutées, donc le fichier temporaire sera toujours supprimé.)

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X