¿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 [email protected] 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory
Tim
fuente
¿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 [email protected]

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 [email protected]
Michael Mrozek
fuente
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 [email protected]:/tmp/id_rsa.pub
ssh [email protected] 
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.

Señor mono
fuente
¡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 [email protected] 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.

pabouk
fuente
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 [email protected]
    
  • 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.

Christipher J THOMPSON
fuente
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
usuario2664227
fuente
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.

simhumileco
fuente