¿Puedo iniciar sesión automáticamente en ssh usando contraseñas del llavero OS X?

9

Necesito iniciar sesión en un servidor ssh que no admite autenticación basada en claves. Y no quiero escribir las contraseñas cada vez.

Estoy usando OS X Lion (10.7.2). He agregado las contraseñas al llavero OS X [1]. Ahora puedo recuperar la contraseña automáticamente del llavero usando /usr/bin/security, sin embargo, no puedo encontrar una manera de enviar esta contraseña al indicador ssh.

También lo intenté sshpass. Sin embargo, cuando intento ejecutarlo, ssh sale con el siguiente error:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

¿Hay alguna forma de iniciar sesión en este servidor sin tener que ingresar la contraseña cada vez?

Notas

  1. El esquema que uso en llavero se ve así
    • Tipo: contraseña de Internet
    • Nombre de usuario
    • Donde: ssh: // nombre-servidor
Chaitanya Gupta
fuente

Respuestas:

11

Sesiones SSH no interactivas

Si no necesita tener una sesión interactiva en el servidor remoto, puede ejecutarla sshen un entorno sin tty, por ejemplo, como parte de una acción Ejecutar script de Shell en Automator .

Debe crear un programa que, cuando se le llame, imprima la contraseña a la salida estándar, por ejemplo, el siguiente script bash que debe hacer ejecutable usando chmod +x pwd.sh:

#!/usr/bin/env bash
echo "password"

Luego, establezca la SSH_ASKPASSvariable de entorno en la ruta de acceso a este programa y luego ejecute sshla acción Automator, de esta manera:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

Cuando no hay tty, pero SSH_ASKPASSy DISPLAY(para X11, configurado de manera predeterminada) están configurados, SSH ejecuta el programa especificado por SSH_ASKPASSy utiliza su salida como contraseña. Está destinado a ser utilizado en entornos gráficos, de modo que pueda aparecer una ventana pidiéndole su contraseña. En este caso, simplemente omitimos la ventana, devolviendo la contraseña de nuestro programa. En securitysu lugar, puede usar para leer desde su llavero, así:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

ls(en la sshlínea de comando) es el comando ejecutado cuando sshha iniciado sesión, y su salida se imprime en Automator. Por supuesto, puede redirigirlo a un archivo para registrar la salida del programa que inicia.


Sesiones interactivas de SSH usando sshpass

Descargué, compilé e instalé sshpassy funcionó perfectamente. Esto es lo que hice:

  1. Obtén las herramientas para desarrolladores de Apple
  2. Descargar y abrir sshpass-1.05.tar.gz
  3. Abra un shell en el directorio sshpass-1.05
  4. correr ./configure
  5. correr make
  6. Ejecutar make install(es posible que lo necesite sudo)

Ahora el programa está instalado en /usr/local/bin/sshpass. Ejecute usando una línea como la siguiente:

sshpass -pYourPassword ssh username@hostname

Puede leer la contraseña securityjusto antes de hacerlo y usarla así:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

Envuelva esto en una función de shell y puede simplemente escribir, por ejemplo, ssh-yourhostnamepara conectarse, para que recupere e ingrese la contraseña automáticamente.

Daniel Beck
fuente
Hola, he votado tu respuesta ya que me llevó a la solución. Sin embargo, lo que describió aquí no funcionó exactamente (esto podría ser específico de la versión de ssh de Lion) 1) Para las sesiones no interactivas, ssh todavía me pidió una contraseña, y después de ingresarla, la obtuve STDIN is not a terminal. 2) Para sesiones interactivas con sshpass, la -popción aparentemente no hace nada. ¡Pero correr sshpassmientras SSH_ASKPASSestá configurado funciona!
Chaitanya Gupta
@ChaitanyaGupta Odd. Funcionó para mí de forma no interactiva desde Automator en Lion. Con respecto a ese segundo problema, es posible que haya tenido una sesión de shell sucia en ese momento, ya no estoy seguro. +1 para usted, y gracias por agregar su solución al sitio.
Daniel Beck
Lo malo (con respecto a 1): estaba tratando de ejecutar la sesión no interactiva en el terminal y no en Automator. Lo probé en Automator ahora, y todavía recibo un STDIN is not a terminalerror. Sin embargo, esta vez no se me solicitó ninguna contraseña; Creo que SSH_ASKPASSestá funcionando en el Automator ya que, si hago que el archivo SSH_ASKPASSdevuelva la contraseña incorrecta, aparece un Permission denied, please try again.error.
Chaitanya Gupta
1
Para los últimos ejemplos, tenga en cuenta que, bajo Unix, los sistemas operativos pueden tener argumentos de línea de comando y variables de entorno visibles para otros usuarios en el sistema, por lo que esto no es seguro en un entorno multiusuario sensible.
Jürgen Strobel
@DanielBeck cualquier idea de cómo hacer que esto funcionemacOs >= 10.13
nbari
7

Encontré una solución (gracias a Daniel Beck por proporcionar la información clave necesaria para esto). Tenga en cuenta que solo he probado esto con OS X Lion 10.7.2. Si esto no funciona para usted, pruebe la solución de Daniel.

Primero, debemos establecer la SSH_ASKPASSvariable de entorno: su valor debe ser la ruta a un programa que imprima la contraseña a la salida estándar. Para obtener la contraseña del llavero, así es como debe verse (lo llamo get-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

Un par de puntos a tener en cuenta:

  1. Esto supone que ha almacenado la contraseña en el llavero de la manera que describí en la pregunta

  2. El programa dado SSH_ASKPASSse llamará sin ningún argumento; entonces usamos variables de entorno para pasarle el nombre de usuario y host.

Ahora podemos configurar SSH_PASSWORD_USERy SSH_PASSWORD_HOSTNAMEejecutar sshpasspara iniciar sesión en nuestro servidor.

Creé otro script ssh-kcpass, para hacer esto:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

Para iniciar sesión en el servidor ssh sin escribir ninguna contraseña, solo necesita ejecutar ssh-kcpass user@hostname.

Chaitanya Gupta
fuente
Cómo hacer que esto funcionemacOS >= 10.13
nbari
-3

Hola gente, me encontré con este tema buscando otra cosa pero ... No sé si me estoy perdiendo algo aquí ... pero tu enfoque me parece extraño. ¿por qué no usar la autenticación de clave pública? ... Generar una clave rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Lo ideal sería usar una vez el ssh-copy-id user @ host y autenticar con contraseña una vez para instalar la clave en el otro servidor, o usar cualquier tipo de script o herramienta de autorización para desplegar la clave en ~ / .ssh / Authorizedkeys en el otro host (para el usuario con el que desea iniciar sesión) Si se hace con el comando manualmente, debe editar / etc / ssh / sshd_config en consecuencia y con automatización (chef, ansible) presionaría la condiga completa para el estado deseado.

La clave que importa distribuir es id_rsa.pub, mantenga segura la clave privada

Para usar el llavero para autenticarse en los hosts de forma automática y directa, edite en su máquina el ~ / .ssh / config y agregue:

Host * UseKeychain sí

Busque más información sobre las opciones del archivo de configuración ssh, espero que esto sea útil

Ricardo Mendes
fuente
1
Lea la primera oración del cuerpo de la pregunta: '' Necesito iniciar sesión en un servidor ssh que no admite autenticación basada en claves. ''
Scott
Hola Scott, creo que también te perdiste la parte en la que dice que no quiere escribir la contraseña cada vez, lo que significa que lo está haciendo.
Ricardo Mendes
No, no me lo perdí. ¿Por qué crees que lo hice?
Scott
BC todavía estás hablando
Ricardo Mendes