当 ssh-add 在启动时添加身份时,如何获得密码的 ssh-add 查询通行证(密码管理器)?

当 ssh-add 在启动时添加身份时,如何获得密码的 ssh-add 查询通行证(密码管理器)?

我有(并且需要)多个 ssh 密钥。我经常在一个会话中需要所有这些,并且我配置 ssh,以便它自动为正确的服务器选择正确的一个,所以我想我应该编写一个脚本在登录时将它们全部添加。我把这个放进去.profile

eval $(ssh-agent)
ssh-add ~/list/of/ ~/paths/to/keys

效果很好,因为它尝试在登录时添加密钥并询问我使用的密码ssh-askpass(注意小写:我的意思是程序,而不是环境变量)。

不过,我也用来pass存储我的密码,包括我的各种 ssh 密钥的密码。我知道 的 gpg 身份验证的密码pass,但是我当然不会记住 pass 中存储的所有密码,这使得 ssh 提示输入这些密码毫无用处。

我如何ssh-add询问pass不同密码的密码(然后pass提示我输入 gpg 身份验证密码,而不是 ssh 提示我输入单独的 ssh 密码)?

中的密码pass与 ssh id 文件的命名方式不同,而是以类似模式的方式命名(例如,对于 ssh id,id_rsa_personal相应的密码为 (~/.password-store/) ssh/personal)。

也许完全绕过 pass 包装器的原始 gpg 脚本会更好?

感谢所有帮助!

答案1

这对我有用:

if [[ -v PASS_PATH ]]; then
    pass $PASS_PATH
    exit $?
fi

for I in \
    "$HOME/.ssh/id_key_1_ed25519;your/path/in/pass/for/key1" \
    "$HOME/.ssh/id_key_2_rsa;your/path/in/pass/for/key1"
do
    SSHKEYPATH=${I%;*}
    PASS=${I#*;}
    SSH_ASKPASS_REQUIRE="force" SSH_ASKPASS="$0" PASS_PATH="$PASS" ssh-add $SSHKEYPATH < /dev/null
done

这主要是基于如何使 ssh-add 从文件中读取密码?并使用< /dev/null强制ssh-add真正调用askpass程序。

相关内容