¿Cómo se copia la clave pública en un servidor ssh?


33

Esto es lo que he intentado y recibí un error:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory

¿Por qué no hacerlo en dos pasos? ¿Copiarlo y luego agregarlo?
— Faheem Mitha

@FaheemMitha: Eso funciona, ¡gracias! De hecho, podría darme cuenta de la causa del problema. Por favor, vea mi nueva publicación ?
— Tim

¡Con el parámetro -f no necesita la clave privada, por lo que puede pasar la clave solo con la clave pública de alguien!
— Kzqai

Respuestas:


67

OpenSSH viene con un comando para hacer esto ssh-copy-id,. Simplemente le da la dirección remota y agrega su clave pública al authorized_keysarchivo en la máquina remota:

$ ssh-copy-id tim@just.some.other.server

Es posible que necesite usar la -ibandera para ubicar su clave pública en su máquina local:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
¡Gracias! ¿Por qué mi comando no funciona?
— Tim

@Tim Esta respuesta lo explicó; >>es manejado por su shell, y está ejecutando el comando a través de SSH en lugar de hacerlo a través de un shell. Su solución de hacer que SSH ejecute un shell, que luego ejecuta su comando, debería funcionar
— Michael Mrozek

¡Gracias! (1) ssh-copy-id tampoco funciona. Copio manualmente el archivo al control remoto y agrego su contenido, luego funciona. Me pregunto por qué es esto? Descubrí que mi shell predeterminado en el servidor es algún script, que actualizo a mi publicación original, y podría ser la razón. Por favor échale un vistazo. (2) Me pregunto si ssh-copy-id es solo copiar la clave pública al control remoto, no crea la clave pública y privada, ¿verdad?
— Tim

1
Supongamos que el servidor SSH está configurado de tal manera que solo acepta la autenticación de clave pública como mecanismo de autenticación. En ese caso, usar ssh-copy-idno funcionará, ¿verdad?
— Abdull

1
@Abdull No, a menos que ya tenga alguna otra clave en esa máquina para conectarse. Solo se conecta a través de SSH
— Michael Mrozek

31

Siempre puedes hacer algo como esto:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

No estoy seguro si puede catdesde una máquina local a una sesión ssh. Simplemente muévalo a / tmp como se sugiere.

Editar: Esto es exactamente lo que ssh-copy-idhace. Justo como dijo Michael.


¡Gracias! Me pregunto si ssh-copy-id es solo copiar la clave pública al control remoto. No crea la clave privada y pública, ¿verdad?
— Tim

No, no lo crea. Solo lo agrega.
— Sr.Monkey

@ Mr.Monkey Sí, puede canalizar datos en una sesión ssh (desde cato de otra manera). Lo que estás describiendo es la forma anticuada; ssh-copy-idse recomienda porque hay menos riesgo de errores tipográficos o de otorgar permisos incorrectos a los archivos.
— Gilles 'SO- deja de ser malvado'

@Gilles, no siempre tiene acceso al servidor para el cliente, especialmente cuando está preparando una computadora para su funcionamiento, por lo que este método es mucho mejor que usar ssh-cpy-id porque no necesita llevar el equipo o conectarse a la red antes de configurar.
— e-info128

1
O puede simplemente tubería directamente al destino : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
— Pablo A

7

Esta respuesta describe cómo hacer que funcione la forma prevista que se muestra en la pregunta.

Puede ejecutar un shell en la computadora remota para interpretar el significado especial del >>operador de redirección:

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

El operador de redirección >>normalmente es interpretado por un shell.

Cuando ejecuta ssh host 'command >> file', no se garantiza que command >> filesea ​​interpretado por un shell. En su caso, command >> filese ejecuta en lugar del shell sin una interpretación especial y >>se le dio al comando como argumento, de la misma manera que se ejecuta command '>>' fileen un shell.

Algunas versiones de SSH (OpenSSH_5.9) invocarán automáticamente el shell en el servidor remoto y le pasarán los comandos cuando detecten tokens para ser interpretados por un shell como ; > >>etc.


3

opensshno proporcionar ssh-copy-id. La secuencia sería:

  • Genera una clave decente de 4k

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Inicie su agente ssh y absorba información como SSH_AGENT_PID, etc.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Ahora comience a cargar claves en su agente SSH

    ssh-add ~/.ssh/id_rsa4k
    
  • Comprueba que está cargado

    ssh-add -l
    ssh-add -L
    

    Esto le mostrará lo que tiene en el agente ssh

  • Ahora realmente SSH a un sistema remoto

    ssh username@remotehost.network
    
  • Ahora puede ejecutar ssh-copy-id sin argumentos:

    ssh-copy-id
    

    Esto crea ~/.ssh/authorized_keysy completa la información básica requerida de ssh-agent.


Por cierto, creé un pequeño script en github.com/centic9/generate-and-send-ssh-key que ejecuta la mayoría de estos pasos de una sola vez y, además, garantiza los permisos de archivo / directorio que generalmente siempre me causaron dolores de cabeza ...
— centic

Este es un gran método para usar cuando el inicio de sesión con contraseña está desactivado. Permite agregar una nueva clave mientras se autentica con una clave anterior.
— MountainX

1

Tuve problemas con ssh-copy-id al elegir otro puerto que no sea 22 ... así que aquí está mi línea con un puerto ssh diferente (por ejemplo, 7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

De hecho, el the ssh-copy-idcomando hace exactamente esto (desde el openssh-clientpaquete):

ssh-copy-id user@host

Nota:
hostsignifica dirección IP o dominio .


Me gustaría también agregar información adicional a esto

1) Podemos especificar un puerto diferente para SSH en el servidor de destino:

ssh-copy-id "-p 8127 user@host"

Nota:
El puerto debe estar frente al user@hosto no se resolverá.

Fuente

2) Podemos especificar un archivo con una clave pública :

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

Nota:
La -iopción nos permite indicar la ubicación apropiada del nombre con el archivo que contiene la clave pública.

A veces puede ser útil, especialmente si lo almacenamos en una ubicación no estándar o si tenemos más de una clave pública en nuestra computadora y queremos señalar una específica.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.