我读过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而且它本身也会受到竞争的影响。