1 votos

El comando "ssh-keyscan 192.168.1.X | ssh-keygen -lf -" no funciona en MacOS "El Capitan"

En Linux y (Windows a través de gitbash) si se ejecuta el comando:

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

Funciona como se esperaba, pero en MacOS (El Capitan) surge

-: No such file or directory
# 192.168.1.X SSH-2.0-OpenSSH .....
# 192.168.1.X SSH-2.0-OpenSSH .....
# 192.168.1.X SSH-2.0-OpenSSH .....

¿Cómo se arregla esto?

Nota El bash versión en mi MacOS es 3.2.57(1)-liberación y si se ejecuta ssh -V devuelve OpenSSH_6.9p1, LibreSSL 2.1.8

1 votos

En MacOS Monterey el comando anterior funciona, por lo que parece que la versión de Openssh incluida con El Capitan no soporta la lectura del archivo de claves desde la entrada estándar (tenga en cuenta que Apple tiene su propio fork de openssh, ver opensource.apple.com/releases ). Como solución alternativa, puede utilizar la sustitución de procesos de la siguiente manera ssh-keygen -lf <(ssh-keyscan 192.168.1.X) . ¿Podría probarlo e informarnos?

0 votos

Gracias por el apoyo - cuando se ejecuta el comando sugerido - la última línea es /dev/fd/63 is not a public key file - He añadido la información de la versión SSH en el post también

1 votos

Gracias por la prueba, lástima que no haya funcionado. Tendrás que guardar primero el fichero de claves y luego pasarlo a ssh-keygen por ejemplo: ssh-keyscan 192.168.1.X > /tmp/keyfile; ssh-keygen -lf /tmp/keyfile; rm /tmp/keyfile . Podrías guardar ese comando como una función del shell para acelerar el proceso (si necesitas ayuda con eso, házmelo saber y publicaré una respuesta).

1voto

Phill Puntos 126

La versión de Openssh incluida en El Capitán no admite la lectura del archivo de claves desde la entrada estándar y según sus pruebas , no apoya sustitución de procesos ( ssh-keygen -lf <(ssh-keyscan 192.168.1.X) o bien.

Esto significa que tendrá que guardar primero el archivo de claves y luego pasarlo a ssh-keygen .

Puedes usar:

  • a función (cambio skg a un nombre de su gusto):

    function skg() {
        if [[ $1 == "" ]]; then
            echo "$FUNCNAME: Specify an IP address or host name to read an SSH key from";
            return 1;
        else
            ip_address=$1;
        fi;
        tmp_file=$(mktemp);
        ssh-keyscan $ip_address > $tmp_file;
        ssh-keygen -lf $tmp_file
        rm $tmp_file
    }

    donde:

    • mktemp es un comando que crea un archivo temporal con un nombre único que sólo puedes leer tú.
    • $FUNCNAME es una variable shell que devuelve el nombre de la función

    Añade la función a tu .bashrc abra una ventana de Terminal y ejecútelo como sigue:

    skg 192.168.1.X

  • a una línea r:

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

    (Tenga en cuenta que utilizo ; para separar los comandos en lugar de && porque este último es un operador condicional Es decir, en una construcción como ésta: commandA && commandB , commandB sólo se ejecutará si commandA tiene éxito, lo que podría evitar que el archivo temporal se borre en el último paso si se produce un error. ; por otro lado, es sólo un separador para que se ejecuten todos los comandos, por lo que el archivo temporal siempre se borrará).

1 votos

Gracias por el código de función adicional - BTW el orden correcto es el comandoB sólo se ejecuta si el comandoA ha tenido éxito - Sugerí la edición

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X