¿Cómo pasar una frase de contraseña a ssh-add sin activar un mensaje?

¿Cómo pasar una frase de contraseña a ssh-add sin activar un mensaje?

Leí man ssh-addy no veo una marca para pasar una frase de contraseña como la que tenemos en sshwhich is-p .

Lo intenté

# the -K is for macOS's ssh-add but it's not relevant
ssh-add -q -K ~/.ssh/id_rsa <<< $passphrase

Pero obtengo el siguiente resultado:

ssh_askpass: exec(/usr/X11R6/bin/ssh-askpass): No such file or directory

¿Cómo puedo pasar una contraseña sin activar un mensaje?

Actualizar

Para agregar más contexto a lo que estoy haciendo, estoy creando un script para crear claves SSH por mí. Generará la frase de contraseña, la clave SSH usando esa frase de contraseña y la agregará al agente.

# ...
passphrase=$(generate_password)

ssh-keygen -t rsa -b 4096 -C $email -f $filename -N $passphrase -q
ssh-add -q -K $filename

Siguiendo la respuesta de Stephen, no estoy seguro de cómo funcionaría. Parece que tuve que crear un script temporal y guardarlo en el disco para que SSH_ASKPASS funcionara. ¿Algunas ideas?

Respuesta1

Desde la ssh-addpágina de manual:

 DISPLAY and SSH_ASKPASS
         If ssh-add needs a passphrase, it will read the passphrase from
         the current terminal if it was run from a terminal.  If ssh-add
         does not have a terminal associated with it but DISPLAY and
         SSH_ASKPASS are set, it will execute the program specified by
         SSH_ASKPASS (by default ``ssh-askpass'') and open an X11 window
         to read the passphrase.  This is particularly useful when calling
         ssh-add from a .xsession or related script.  (Note that on some
         machines it may be necessary to redirect the input from /dev/null
         to make this work.)

Entonces podemos usar esto para hacer un poco de trampa.

Empezamos sin identidades en el agente:

$ ssh-add -l
The agent has no identities.

Ahora necesitamos un programa que nos proporcione la contraseña:

$ cat x
#!/bin/sh
echo test123

Y luego convenza a ssh-add para que use ese script:

$ DISPLAY=1 SSH_ASKPASS="./x" ssh-add test < /dev/null
Identity added: test (sweh@godzilla)

Y ahí está:

$ ssh-add -l                                          
2048 SHA256:07qZby7TafI10LWAMSvGFreY75L/js94pFuNcbhfSC0 sweh@godzilla (RSA)

Edite para agregar, según la pregunta revisada:

La contraseña podría pasarse como una variable y el script Askpass usaría esa variable.

Por ejemplo:

$ cat /usr/local/sbin/auto-add-key
#!/bin/sh
echo $SSH_PASS

$ SSH_PASS=test123 DISPLAY=1 SSH_ASKPASS=/usr/local/sbin/auto-add-key ssh-add test < /dev/null
Identity added: test (sweh@godzilla)

En el flujo de trabajo presentado, lo que haría sería SSH_PASS=$passphraseutilizar la frase de contraseña recién generada.

Respuesta2

Puedes usarlo script(1)como mini- expect.

En Linux:

{ sleep .1; echo password; } | script -q /dev/null -c 'ssh-add /path/to/identity'

En BSD:

{ sleep .1; echo password; } | script -q /dev/null ssh-add /path/to/identity

Es posible que desee aumentar el retraso ( sleep .3o sleep 1) si el lado derecho de la tubería tarda en iniciarse. Para algo más complejo, useexpect. No lo use sshpassya que en realidad no es mejor que scripty está sujeto aRazas.

información relacionada