Leí man ssh-add
y no veo una marca para pasar una frase de contraseña como la que tenemos en .ssh
which 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-add
pá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=$passphrase
utilizar 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 .3
o sleep 1
) si el lado derecho de la tubería tarda en iniciarse. Para algo más complejo, useexpect
. No lo use sshpass
ya que en realidad no es mejor que script
y está sujeto aRazas.