Cómo SSH en una línea

26

¿Cómo me conectaría a otra computadora a través de SSH en una línea? Si ssh host@IPtuviera que hacerlo , me requeriría ingresar la contraseña en la segunda línea. Estaba pensando que podría hacer algo como esto: ssh host@IP | echo passwordpero eso pone la contraseña antes de pedirla.

Ben A.
fuente
3
Este tipo de pensamiento proviene de los días de telnet y espera, cuando Internet era un lugar más seguro. La respuesta de Allen es correcta, la respuesta de Jakuje es técnicamente cierta, pero no es la herramienta para el trabajo en la mayoría de los lugares.
Criggie
3
Esta es una buena pregunta para configurar el inicio de sesión sin contraseña. Le pediría que revise su respuesta aceptada. La respuesta correcta de Jakuje es correcta y funcionará, la forma correcta de hacerlo es con las claves SSH, descritas en la respuesta de Allan.
Scot
Si sshleería la contraseña de stdin, entonces echo password | ssh host@IPfuncionaría, pero generalmente SSH intenta leer directamente desde el terminal.
Paŭlo Ebermann

Respuestas:

82

Debería usar claves SSH para autenticarse en lugar de poner su contraseña en la línea de comando, ya que es extremadamente insegura.

La forma en que funciona es que una vez que haya configurado sus claves SSH, todo lo que tiene que hacer es emitir el comando:

ssh user@host

y sin escribir otra cosa, iniciarás sesión automáticamente.


Copie la clave pública SSH a Mac / FreeBSD / Linux desde macOS

Esto supone que tiene acceso al servidor remoto a través de una autenticación basada en contraseña (tecleando una contraseña) y que ya ha generado su par de claves privado / público (si no, vea a continuación). En el siguiente ejemplo, estamos utilizando RSA. Para comenzar, copiemos la clave (tenga en cuenta que el directorio "home" difiere entre macOS, Linux, BSD, etc.):

Usando SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

O simplemente capturando el archivo authorized_keys(prefiero este método):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Su nombre de clave puede diferir) Si el directorio .ssh no existe en el servidor remoto, deberá iniciar sesión y crearlo.

Ahora la clave se ha copiado de la Mac al servidor remoto . Establezca los permisos correctos para la clave pública SSH en el servidor remoto:

chmod 600  ~/.ssh/id_rsa.pub

A continuación, agregue la clave al archivo SSH autorizado_claves, si el archivo no existe, créelo.

Si el archivo authorized_keysya existe en ~/.sshel uso del siguiente comando:

cat id_rsa.pub >> authorized_keys

Si el archivo no existe, ingrese los siguientes comandos:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Generar clave pública / privada SSH en macOS

Abra la Terminal yendo a Aplicaciones -> Utilidades -> Terminal

En el terminal, use el siguiente comando para iniciar la generación de claves

ssh-keygen -t rsa

A continuación, se le pedirá que proporcione la ubicación donde desea crear el archivo de clave privada:

Introduzca el archivo en el que guardar la clave ( /Users/username/.ssh/id_rsa):

Déjelo vacío para crear la clave en la ubicación predeterminada, que es /Users/username/.ssh/id_rsa. El archivo de clave pública se creará en la misma ubicación y con el mismo nombre, pero con la extensión .PUB.

Después se le pedirá que elija una frase de contraseña. Esta es la contraseña opcional para usar la clave privada.

Enter passphrase (empty for no passphrase):

Se genera su clave SSH.

Ahora, tenga en cuenta que si ingresa una frase de contraseña, deberá ingresarla cada vez que se conecte. La utilidad ssh-agentmantendrá la frase de contraseña en la memoria aliviando la necesidad de ingresarla manualmente cada vez que se conecte mientras está en la misma sesión. Para más detalles verman ssh-agent

Alano
fuente
66
Absolutamente esto: las claves pueden y deben reemplazar por completo las contraseñas para cualquier acceso ssh a través de Internet. Le sugiero que amplíe la necesidad de seguridad de la clave privada, que no es algo que deba tener en todas sus computadoras.
Criggie
+1 Esta es una muy buena respuesta, no solo por lo que dice, sino también por cómo lo has explicado. ¡Cualquier cosa que sea más fácil de seguir para los usuarios y les ayude a estar más seguros es una ventaja en mis libros!
Monomeeth
77
Gran respuesta. Solo quería agregar que ssh-copy-ides una buena herramienta para automatizar algunos de los anteriores.
Scot
Una mención de ssh-agent también podría ayudar. La mayoría (¿todas?) Versiones de OS X / macOS vienen con él, y permite un inicio de sesión sin contraseña incluso cuando la clave está protegida con contraseña.
Qsigma
1
@Scot: no forma parte de macOS de forma predeterminada y debe instalarse a través de Homebrew o MacPorts . No soy un fanático de la instalación de software, ya que las cosas se pueden lograr en 1 línea o en un guión corto y auto escrito, y por esas razones pensé que estaba fuera del alcance de la respuesta. Sin embargo, es una buena pequeña utilidad y vale la pena mencionar.
Allan
13

Hay varias posibilidades Obviamente, su ejemplo no funcionará, pero puede lograr algo similar con la sshpassutilidad:

sshpass -p password ssh host@IP

Tenga en cuenta que esto no se recomienda porque passwordserá visible para otros procesos o en el historial del shell.

Una forma mucho mejor de hacer lo mismo es configurar la autenticación sin contraseña utilizando claves SSH. En breve:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP
Jakuje
fuente
Intenté lo sshpassque me recomendó, pero decía que no se encontró el comando.
Ben A.
8
Bueno ... probablemente tendrás que instalarlo. Y no, no lo recomiendo. Configure la autenticación sin contraseña con las teclas ssh.
Jakuje
44
@BenA. configure la autenticación sin contraseña definiendo un teclado público / privado y configurándolo en ambas máquinas involucradas. Eso es mucho más fácil (y en realidad más seguro) que cualquier contraseña
nohillside
8
Mil veces no. sshpass es un truco sucio que se usa para conectarse a dispositivos que hablan ssh pero no hacen las teclas correctamente, y su uso principal son los scripts de configuración. No usaría sshpass en una máquina multiusuario ps auxw | grep sshpass le dirá a otros usuarios la contraseña ssh.
Criggie
1
@Criggie, no del todo. Si bien estoy 100% detrás de la solución basada en claves, tengo sshpass en un par de Raspberry Pis solo para uso interno (para tareas aleatorias y a las que acceden clientes aleatorios; pasar las claves solo para uso interno es una molestia). El funcionamiento de su comando da el siguiente resultado: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh [email protected]. El zzzzzzzzes literal; sshpass enmascara el contenido de la contraseña. Quizás las iteraciones anteriores eran menos conscientes de la privacidad.
flith
3

He pasado mucho tiempo buscando la respuesta a esto también. A pesar de ser inseguro y de que todas estas personas le digan que use claves RSA (lo cual ES una idea más segura y confiable ), es bastante posible.

Use un programa llamado expectpara esto. Expect mirará stdout (y creo que stderr si está configurado correctamente) por usted, esperando ciertos mensajes y respondiendo a ellos con salida. Esperar en sí mismo es en realidad un lenguaje de script, y cuando estaba haciendo lo mismo, me costó mucho hacer que mi propio script funcionara correctamente debido al tiempo. Sin embargo, esperar también incluye una práctica utilidad llamada autoexpect.

Con autoexpect, lo observará y generará un script de espera para usted. Simplemente ejecute autoexpect y el comando que desee:

autoexpect ssh host@ip 

y haz lo que normalmente harías. Cuando salga del programa (escribiendo exitel shell ssh'd), generará el script. En caso de que no desee que todo el script que está escribiendo esté en un script esperado, puede editar el script desde autoexpect (llamado script.exp) para salir antes de escribir el exitcomando en el shell. La línea que desea mover para cambiar el final del script es:

expect eof

lo que significa esperar el final del archivo. ¡Espero que esto ayude!

Alano
fuente
1
En caso de que nadie más lo haya dicho aún: ¡Bienvenido a Ask Different!
Synoli
2

Usar expectes simplemente incorrecto para iniciar sesión en una conexión ssh para cualquier cosa que no sea en un conjunto de pruebas.

Lo que está buscando @ ben-a ya está implementado en ssh. El truco es cómo usarlo. Entonces aquí va:

  1. Genere un par de claves público / privado usando ssh-keygen. Use ECDSA o RSA como -t(o tipo) y para RSA use 2048 o 4096 como -b(o longitud BITS). Esto debería ser suficiente al momento de escribir. ¡SIEMPRE use una CONTRASEÑA!
  2. Utilice la ssh-copy-idmetodología o la mencionada anteriormente para crear en la máquina en la que está iniciando sesión (también conocido como el servidor) el ~/.ssh/authorized_keysarchivo. Dentro hay una copia de la clave pública que acaba de generar.
  3. Ahora en la máquina que usa para iniciar sesión en el 'servidor' (o cliente), abra el archivo ~/.ssh/config. Si no existe, puede crearlo.
  4. En este archivo, agrega lo siguiente para sus necesidades

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Ahora puede usar solo ssh <name>para configurar la conexión, pero aún necesitará la contraseña para su clave. Para resolver esto, use el ssh-agent desarrollado e incluido para este propósito. Para agregar su clave al agente simplemente use ssh-add <path to keyfile>. Se le pedirá la contraseña y almacenará la clave de forma segura para esta sesión. Si produce el error "no se puede encontrar el agente ssh" (o similar), eso significa que probablemente el agente no se haya iniciado. Puede iniciarlo para esta sesión usando ssh-agent bash. Esto iniciará un nuevo shell con el agente activo en él.

Al utilizar estos pasos, no solo hace que sea más difícil para alguien hacerse pasar por usted secuestrando sus credenciales, sino que también mantiene la usabilidad en orden (es más fácil de usar que las contraseñas simples).

LvB
fuente