Como passar uma senha para ssh-add sem acionar um prompt?

Como passar uma senha para ssh-add sem acionar um prompt?

Eu li man ssh-adde não vejo um sinalizador para passar uma senha como a que temos em sshwhich 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-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.)

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=$passphrasea 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 .3ou sleep 1) se o lado direito do pipeline demorar para iniciar. Para algo mais complexo, useexpect. Não use sshpass, pois não é melhor scripte está sujeito acorridas.

informação relacionada