Как передать парольную фразу в ssh-add, не вызывая запроса?

Как передать парольную фразу в ssh-add, не вызывая запроса?

Я читаю man ssh-addи не вижу флага для передачи парольной фразы, как у нас, в sshкотором есть-p .

Я пытался

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

Но я получаю следующий вывод:

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

Как передать пароль без появления запроса

Обновлять

Добавляя больше контекста к тому, что я делаю, я создаю скрипт для создания ключей SSH для меня. Он сгенерирует парольную фразу, ключ SSH, использующий эту парольную фразу, и добавит его в агента.

# ...
passphrase=$(generate_password)

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

После ответа Стивена я не уверен, как это будет работать. Похоже, мне пришлось бы создать временный скрипт и сохранить его на диске, чтобы SSH_ASKPASS заработал. Есть идеи?

решение1

Из ssh-addстраницы руководства:

 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.)

Так что мы можем использовать это, чтобы немного схитрить.

Начнем с отсутствия идентификаторов у агента:

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

Итак, теперь нам нужна программа, которая предоставит пароль:

$ cat x
#!/bin/sh
echo test123

А затем убедим ssh-add использовать этот скрипт:

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

И вот оно:

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

Отредактируйте, чтобы добавить, на основе пересмотренного вопроса:

Пароль можно передать как переменную, и скрипт askpass будет использовать эту переменную.

Например:

$ 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)

В представленном рабочем процессе вам нужно будет SSH_PASS=$passphraseиспользовать вновь сгенерированную парольную фразу.

решение2

Можно использовать script(1)как мини- expect.

В Linux:

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

На BSD:

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

Вы можете увеличить задержку ( sleep .3или sleep 1), если правая часть конвейера медленно запускается. Для чего-то более сложного используйтеexpect. Не используйте, sshpassтак как это на самом деле не лучше scriptи само по себе подверженогонки.

Связанный контент