Ser*_*ich 9 linux ssh shell ssh-keys ssh-agent
我ssh在我的应用程序中使用命令运行 shell 脚本。使用的私钥是通过密码加密的,问题是 - 当被问到时我无法交互地传递它。密钥没有添加到ssh-agent. 我无法执行,ssh-add my_key因为密码应该以交互方式传递。对终端通信有好处,但在应用内部使用不太好。
该man page说:
显示和 SSH_ASKPASS
如果 ssh-add 需要密码短语,如果它是从终端运行的,它将从当前终端读取密码短语。如果 ssh-add 没有与之关联的终端,但设置了 DISPLAY 和 SSH_ASKPASS,它将执行 SSH_ASKPASS 指定的程序并打开 X11 窗口以读取密码。这在从 .xsession 或相关脚本调用 ssh-add 时特别有用。(请注意,在某些机器上,可能需要重定向来自 /dev/null 的输入才能使其工作。)
当我执行时,SSH_ASKPASS=file_with_passphrase ssh-add my_key我仍然要求输入密码,在这种情况下,看起来 env var 只是被忽略了。我尝试执行ssh -o BatchMode=yes并且服务器拒绝了编码的密钥,因为没有人能够对其进行解码。
我绝对可以在使用之前手动解码 ssh 密钥,ssh-agent但看起来我即将从SSH_ASKPASS变量中获得我需要的东西,但我不知道如何使它工作。很高兴得到社区帮助。
Iwa*_*amp 10
因此,实际上有一些事情对您尝试做的事情很重要:
stdout。因此,举一个让它工作的例子(对我来说,我猜也应该在其他 Linux 上工作):
创建虚拟密钥:
ssh-keygen -t rsa -C se-so-38354773 -f /tmp/se-so-38354773.key -N 'se-so-38354773-pp'
Run Code Online (Sandbox Code Playgroud)
创建 askpass 脚本以回显密码文件:
cat > /tmp/se-so-38354773-askpass <<EOF
#!/usr/bin/env bash
echo "${0}:${@} : this is for debugging to see if the echo script runs" 1>&2
echo "se-so-38354773-pp"
EOF
chmod +x /tmp/se-so-38354773-askpass
Run Code Online (Sandbox Code Playgroud)
我将此文件放在 /tmp/ 中 - 但这对安全性不利,除非您在写入文件之前还更改了该文件的权限以确保其他人无法读取它(或设置 umask)。
然后你可以做 ssh-add 如下:
DISPLAY=":0.0" SSH_ASKPASS="/tmp/se-so-38354773-askpass" setsid ssh-add /tmp/se-so-38354773.key </dev/null
Run Code Online (Sandbox Code Playgroud)
在setsid从终端分离,如果有一个-这是没有必要在我的电脑上,虽然-但是,是-我认为它可能在一些其他情况下是必要的。
完成测试后,请进行清理:
ssh-add -d /tmp/se-so-38354773.key
rm /tmp/se-so-38354773*
Run Code Online (Sandbox Code Playgroud)
我的计算机上的示例输出:
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$ ssh-keygen -t rsa -C se-so-38354773 -f /tmp/se-so-38354773.key -N 'se-so-38354773-pp'
Generating public/private rsa key pair.
Your identification has been saved in /tmp/se-so-38354773.key.
Your public key has been saved in /tmp/se-so-38354773.key.pub.
The key fingerprint is:
SHA256:s+jVUPEyb2DzRM5y+Hm3XDzVRREKn5yU2d0hk61hIQ0 se-so-38354773
The key's randomart image is:
+---[RSA 2048]----+
| .E+=B=O|
| B*B*o=|
| X B*o o|
| o % o ..|
| S * ..+|
| . = . ...+|
| . o . o |
| . . |
| . |
+----[SHA256]-----+
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$ cat > /tmp/se-so-38354773-askpass <<EOF
> #!/usr/bin/env bash
> echo "${0}:${@} : this is for debugging to see if the echo script runs" 1>&2
> echo "se-so-38354773-pp"
> EOF
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$ chmod +x /tmp/se-so-38354773-askpass
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$ DISPLAY=":0.0" SSH_ASKPASS="/tmp/se-so-38354773-askpass" setsid ssh-add /tmp/se-so-38354773.key </dev/null
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$
bash: : this is for debugging to see if the echo script runs
Identity added: /tmp/se-so-38354773.key (/tmp/se-so-38354773.key)
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$ ssh-add -d /tmp/se-so-38354773.key
Identity removed: /tmp/se-so-38354773.key (se-so-38354773)
iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
$ rm /tmp/se-so-38354773*
Run Code Online (Sandbox Code Playgroud)