如何在不触发提示的情况下将密码传递给 ssh-add?

Chr*_*sco 7 command-line bash

我读过man ssh-add,但没有看到像我们那样ssh-p传递密码的标志其中 is

我试过

# the -K is for macOS's ssh-add but it's not relevant
ssh-add -q -K ~/.ssh/id_rsa <<< $passphrase
Run Code Online (Sandbox Code Playgroud)

但我得到以下输出:

ssh_askpass: exec(/usr/X11R6/bin/ssh-askpass): No such file or directory
Run Code Online (Sandbox Code Playgroud)

如何在不触发提示的情况下传递密码

更新

为我正在做的事情添加更多上下文,我正在创建一个脚本来为我创建 SSH 密钥。它将生成密码,使用该密码的 SSH 密钥,并将其添加到代理中。

# the -K is for macOS's ssh-add but it's not relevant
ssh-add -q -K ~/.ssh/id_rsa <<< $passphrase
Run Code Online (Sandbox Code Playgroud)

按照斯蒂芬的回答,我不确定这将如何运作。似乎我不得不创建一个临时脚本并将其保存到磁盘,以便 SSH_ASKPASS 工作。有任何想法吗?

Ste*_*ris 12

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.)
Run Code Online (Sandbox Code Playgroud)

所以我们可以用它来作弊。

我们从代理中没有身份开始:

$ ssh-add -l
The agent has no identities.
Run Code Online (Sandbox Code Playgroud)

所以现在我们需要一个提供密码的程序:

$ cat x
#!/bin/sh
echo test123
Run Code Online (Sandbox Code Playgroud)

然后说服 ssh-add 使用该脚本:

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

它是:

$ ssh-add -l                                          
2048 SHA256:07qZby7TafI10LWAMSvGFreY75L/js94pFuNcbhfSC0 sweh@godzilla (RSA)
Run Code Online (Sandbox Code Playgroud)

编辑添加,基于修改后的问题:

密码可以作为变量传递,而 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)
Run Code Online (Sandbox Code Playgroud)

在展示的工作流程中,您可以SSH_PASS=$passphrase使用新生成的密码。


小智 6

您可以将script(1)其用作迷你expect

在 Linux 上:

{ sleep .1; echo password; } | script -q /dev/null -c 'ssh-add /path/to/identity'
Run Code Online (Sandbox Code Playgroud)

在 BSD 上:

{ sleep .1; echo password; } | script -q /dev/null ssh-add /path/to/identity
Run Code Online (Sandbox Code Playgroud)

如果右侧管道启动缓慢,您可能需要增加延迟 (sleep .3或)。sleep 1对于更复杂的事情,请使用expect. 不要使用sshpass,因为它实际上并不比它更好,script而且它本身也会受到竞争的影响。