¿La forma más fácil de copiar claves ssh a otra máquina?

342

Soy flojo en casa y uso la autenticación de contraseña para mis máquinas domésticas. Estoy listo para pasar a la autenticación basada en claves. Hay muchas opciones en la web sobre cómo hacer esto, incluyendo atrapar y luego pasar la llave, pasar la llave directamente, etc.

Estoy buscando la forma más fácil y recomendada de copiar una clave, ¿espero que haya un contenedor conveniente en algún lugar del paquete ssh de Ubuntu?

Ya estoy al tanto de cómo cerrar los inicios de sesión de contraseña .

Jorge Castro
fuente

Respuestas:

463

El ssh-copy-idcomando (en el paquete openssh-client e instalado por defecto) hace exactamente esto:

ssh-copy-id [email protected]

copia la clave pública de su identidad predeterminada (uso -i identity_filepara otras identidades) en el host remoto.

La identidad predeterminada es su clave ssh "estándar". Se compone de dos archivos (clave pública y privada) en su ~/.sshdirectorio, normalmente nombrado identity, id_rsa, id_dsa, id_ecdsao id_ed25519(y lo mismo con .pub), dependiendo del tipo de llave. Si no creó más de una clave ssh, no tiene que preocuparse por especificar la identidad, ssh-copy-id simplemente la seleccionará automáticamente.

En caso de que no tenga una identidad, puede generar una con la herramienta ssh-keygen.

Además, si el servidor usa un puerto diferente del predeterminado ( 22), debe usar comillas de esta manera ( fuente ):

ssh-copy-id "[email protected] -p <port-number>"
Marcel Stimberg
fuente
1
¿Cuál es la identidad predeterminada?
Oxwivi
17
para diferentes puertos, use esto:ssh-copy-id "user@host -p 6842"
jibon57
55
¿Qué sucede si el servidor remoto al que está copiando no permite solicitudes de contraseña y está básicamente bloqueado, salvo para el acceso SSH?
Cyle
10
En mac puedes hacer brew install ssh-copy-idy luego ejecutar el comando.
Avishai
1
@MarcelStimberg, actualice la respuesta para incluir el perfil -i; es probable que las personas tengan más de 1 tecla y las presionen todas, o que tengan que buscar la opción -i en los comentarios
Nick
129

Me gusta la respuesta de Marcel. No conocía este comando. Siempre he estado usando lo que había encontrado en el sitio web de Oracle :

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys && echo "Key copied"'

Pensé publicarlo aquí todavía, porque es una buena ilustración de lo que se puede lograr en el código de shell con el poder de ssh. ¡Pero usar el ssh-copy-ides definitivamente una forma más segura de hacerlo correctamente!

Tenga en cuenta que si la carpeta .sshaún no existe, el comando anterior fallará. Además, podría ser mejor al crear el archivo establecer un permiso mínimo posible (básicamente lectura-escritura solo para el propietario). Aquí hay un comando más avanzado:

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'umask 0077; mkdir -p .ssh; cat >> .ssh/authorized_keys && echo "Key copied"'
Huygens
fuente
2
Estos comandos exactos también funcionan desde una Mac
Mihai P.
Debería funcionar en cualquier Unix con la mayoría de los shell. He actualizado la publicación con un comando actualizado en caso de que la carpeta .sshno exista en el lado remoto.
Huygens
1
No cates necesario: una redirección de entrada normal es suficiente, por ejemplo< ~/.ssh/id_rsa.pub | ssh ...
maxschlepzig
@ Huygens Gracias. Es más útil recordar este, porque no necesita instalar nada y también puede ser bueno para ejecutar comandos externos, por ejemplo, cambiar los permisos del lado del servidor como lo demostró en su ejemplo avanzado.
Jonathan Komar
2
Prefiero de esta manera, ya que le permite usar ssh detallado que es útil para descubrir por qué las cosas están rotas. sshcopyid simplemente se congeló y nunca funcionó, esto salió a la perfección.
Sirenas
31

Método gráfico

  1. Abra AplicacionesContraseñas y clavesMis claves personales .
  2. Seleccione su clave y luego haga clic en RemotoConfigurar clave para Secure Shell .

Configurar computadora para conexión SSH

ændrük
fuente
No tengo "Contraseñas y claves de cifrado" en mi menú.
Jorge Castro
¿Qué versión de Ubuntu estás usando? En Ubuntu 10.04 LTS, esto debería estar disponible por defecto.
ændrük
10.10, acabo de agregar la etiqueta. ¡La respuesta de Marcel es lo que estoy buscando, aunque +1 para su respuesta orientada al escritorio!
Jorge Castro
44
Este programa es seahorse.
Gilles
1
Creo que esta aplicación está en el menú Sistema-> Preferencias en 10.10 (no puedo verificarlo ahora, estoy en 10.04)
Huygens
18

En Ubuntu puedes obtener tus claves desde Launchpad:

ssh-import-id [launchpad account name]

Detalles :

  1. Necesita una cuenta de Launchpad, así que inicie sesión o cree una cuenta
  2. Después de iniciar sesión, haga clic en el botón junto a las claves SSH:
  3. Pegue el contenido de su archivo de clave pública en ese campo (incluido el comentario). Tal clave se ve así:

    ssh-rsa AAAAB3Nza .... UyDOFDqJp lekensteyn
    

    Aquí, ssh-rsaindica que la clave es una clave RSA, AAAAB3Nza .... UyDOFDqJpes la clave real y lekensteynes el comentario.

  4. Guarde la clave presionando Importar clave pública
  5. Si todo salió bien, su clave ahora debería aparecer en las claves SSH:

El paquete ssh-import-iddebe instalarse en la máquina a la que se debe acceder desde el control remoto. Este paquete se instala junto con el openssh-serverpaquete ya que es un paquete recomendado para openssh-server. Después de asegurarse de que ssh-import-idse haya instalado en la máquina cliente, ejecute:

ssh-import-id [launchpad account name]

Esto descargará la clave pública de los servidores de Launchpad a través de HTTPS que lo protege de los ataques MITM.

En Ubuntu Lucid y antes, puede lograr lo mismo con:

wget https://launchpad.net/~[lp acount name]/+sshkeys -O - >> ~/.ssh/authorized_keys && echo >> ~/.ssh/authorized_keys

El echocomando es necesario para obtener una nueva línea adicional después de la línea con la tecla SSH.

Lekensteyn
fuente
14

para puerto personalizado

ssh-copy-id -i "[email protected] -p2222"

-i cambia por defecto a ~ / .ssh / id_rsa.pub, si desea otra clave, coloque la ruta de la clave después de -i

ADVERTENCIA: Si no escribió el -i, copiará todas las claves encontradas en ~ / .ssh

Omar S.
fuente
1
¿Estás seguro de esa ADVERTENCIA? "-i archivo_de_identidad: use solo la (s) clave (s) contenida en el archivo de identidad (en lugar de buscar identidades a través de ssh-add (1) o en el archivo_ID_determinado). Si el nombre de archivo no termina en .pub, esto se agrega. Si el nombre de archivo se omite, se usa el archivo default_ID_file ".
Yousha Aleayoub
0

ssh-copy-idhace exactamente eso No estoy seguro de por qué algunas de las otras respuestas aquí agregan información inexacta. La ayuda muestra lo siguiente:

~$ ssh-copy-id -h
Usage: /usr/bin/ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
    -f: force mode -- copy keys without trying to check if they are already installed
    -n: dry run    -- no keys are actually copied
    -h|-?: print this help

Acabo de intentar lo siguiente en el cliente Ubuntu 18.04 con un servidor CentOS 7.6 y funcionó de maravilla. El ejemplo muestra el uso de un puerto personalizado de 2222, y la especificación de una clave pública en~/.ssh/path-to-rsa.pub

$ ssh-copy-id -i ~/.ssh/path-to-rsa.pub -p 2222 [email protected]

Antes de ejecutar el comando, en realidad utilicé el -ninterruptor al final para hacer una ejecución en seco que confirmó que el comando funcionará según lo previsto. Una vez que lo confirme, ejecuté el comando nuevamente como se indicó anteriormente, sin el -ninterruptor.

isapir
fuente