我已经为 ssh 设置了一个无密码设置,它使用公钥身份验证来连接所需的远程服务器,一切都运行良好。
我正在使用密码来解锁私钥,使用这个解决方案- 问题是每次我启动我的系统时都会询问密码。
我发现这很麻烦,我只想一劳永逸地输入它,所以下次我启动会话时,我不必再次输入它,是否有类似缓存密钥之类的东西可以保存我的密码并且可以跨越会话(也可以在重新启动后幸存)?
是否有可能在保持我的 ssh 密码完整的同时实现所有这些?
我已经为 ssh 设置了一个无密码设置,它使用公钥身份验证来连接所需的远程服务器,一切都运行良好。
我正在使用密码来解锁私钥,使用这个解决方案- 问题是每次我启动我的系统时都会询问密码。
我发现这很麻烦,我只想一劳永逸地输入它,所以下次我启动会话时,我不必再次输入它,是否有类似缓存密钥之类的东西可以保存我的密码并且可以跨越会话(也可以在重新启动后幸存)?
是否有可能在保持我的 ssh 密码完整的同时实现所有这些?
你想用
keychain
.该
keychain
程序管理密钥缓存程序的一个实例ssh-agent
。启动时ssh-agent
,会创建两个环境变量以进行评估。通常,当 shell 在ssh-agent
已启动的地方关闭时,这些环境变量会丢失。该keychain
程序跨登录跟踪这些变量,并在~\.keychain
目录中提供 shell 脚本。有几种运行方式
keychain
,一种是从命令行手动运行。每次启动 shell 时,使用:这将查找
ssh-agent
它是否正在运行,如果没有,则启动它。无论哪种方式,使用 eval onkeychain
将设置必要的环境变量,您可以使用以下方法添加密钥:如果
private-keyfile
有密码,则在执行过程中会提示您输入该密码ssh-add
,但只要ssh-agent
正在运行,这将是您最后一次需要输入私钥密码。因为 eval
keychain
设置了SSH_AUTH_SOCK
环境变量,所以任何运行都ssh
将使用ssh-agent
来完成身份验证。另一个建议是将
keychain
执行添加到您的.bashrc
文件中,正如StackExchange answer中所建议的那样。要终止
keychain
只需输入命令:或者,如果要关闭 的所有实例
ssh-agent
,请输入命令:请注意,使用诸如
ssh-agent
通过将那些经过身份验证的密钥存储在内存中来破坏密码私钥文件的安全性等服务。这是不安全的,尤其是内存侧信道攻击。如果您对密钥安全性不感兴趣,更简单的解决方案是按照@vidarlo 的建议删除私钥上的密码。运行
ssh-keygen -p
。这将允许您删除密钥上设置的密码。如果未设置密码,则以明文形式存储,无需解锁即可使用:只需在提示输入密码时按 Enter 即可设置无密码。之后,您可以自由使用您的密钥。
简单的答案是否定的
。如果它在重新启动后持续存在,那么它就违背了目的(即保护)。
但是,您可以跨登录会话甚至跨多个终端维持它。
如果您想跨登录会话维持但可以在每个终端输入一次密码,然后添加
eval $(ssh-add)
到.bash_profile
如果您想在每次系统重新启动时执行一次,安装钥匙串,更改您的
~/.ssh/config
文件以将钥匙添加到钥匙串(AddKeysToAgent yes
)并执行上述步骤。