Eu li man ssh-add
e não vejo um sinalizador para passar uma senha como a que temos em .ssh
which is-p
tentei
# the -K is for macOS's ssh-add but it's not relevant
ssh-add -q -K ~/.ssh/id_rsa <<< $passphrase
Mas recebo a seguinte saída:
ssh_askpass: exec(/usr/X11R6/bin/ssh-askpass): No such file or directory
Como posso passar uma senha sem acionar um prompt
Atualizar
Adicionando mais contexto ao que estou fazendo, estou criando um script para criar chaves SSH para mim. Ele irá gerar a senha, a chave SSH usando essa senha, e adicioná-la ao agente.
# ...
passphrase=$(generate_password)
ssh-keygen -t rsa -b 4096 -C $email -f $filename -N $passphrase -q
ssh-add -q -K $filename
Seguindo a resposta de Stephen, não tenho certeza de como isso funcionaria. Parece que tive que criar um script temporal e salvá-lo em disco para que o SSH_ASKPASS funcionasse. Alguma ideia?
Responder1
Na 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.)
Então podemos usar isso para trapacear um pouco.
Começamos sem identidades no agente:
$ ssh-add -l
The agent has no identities.
Então agora precisamos de um programa que forneça a senha:
$ cat x
#!/bin/sh
echo test123
E então convença o ssh-add a usar esse script:
$ DISPLAY=1 SSH_ASKPASS="./x" ssh-add test < /dev/null
Identity added: test (sweh@godzilla)
E aí está:
$ ssh-add -l
2048 SHA256:07qZby7TafI10LWAMSvGFreY75L/js94pFuNcbhfSC0 sweh@godzilla (RSA)
Edite para adicionar, com base na pergunta revisada:
A senha pode ser passada como uma variável e o script askpass usa essa variável.
Por exemplo:
$ 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)
No fluxo de trabalho apresentado, você usaria SSH_PASS=$passphrase
a senha recém-gerada.
Responder2
Você pode usar script(1)
como um mini- expect
.
No Linux:
{ sleep .1; echo password; } | script -q /dev/null -c 'ssh-add /path/to/identity'
No BSD:
{ sleep .1; echo password; } | script -q /dev/null ssh-add /path/to/identity
Você pode querer aumentar o atraso ( sleep .3
ou sleep 1
) se o lado direito do pipeline demorar para iniciar. Para algo mais complexo, useexpect
. Não use sshpass
, pois não é melhor script
e está sujeito acorridas.