我已经为 ssh 设置了一个无密码设置,使用公钥认证来连接所需的远程服务器,一切都运行良好。
我正在使用密码来解锁私钥,使用这个解决方案— 问题是每次我启动系统时它都会询问密码。
我觉得这很麻烦,我只想输入一劳永逸所以下次启动会话时,我不需要再次输入它,是否有类似缓存密钥的东西可以保存我的密码并在整个会话中工作(重启后也能保留)?
是否有可能在保持我的 ssh 密码完整的同时实现所有这些功能?
答案1
您想使用keychain
。
该keychain
程序管理密钥缓存程序的一个实例ssh-agent
。ssh-agent
启动时,会创建两个环境变量以供评估。通常,当关闭已ssh-agent
启动的 shell 时,这些环境变量会丢失。该keychain
程序会在登录时跟踪这些变量,并在~\.keychain
目录中提供 shell 脚本。
有多种方法可以运行keychain
,其中一种方法是从命令行手动运行。每次启动 shell 时,使用:
eval `keychain --eval`
这将查找ssh-agent
它是否正在运行,如果未运行则启动它。无论哪种方式,使用 eval onkeychain
都会设置必要的环境变量,您可以在其中使用以下命令添加键:
ssh-add <private-keyfile>
如果private-keyfile
有密码,则在执行期间会提示您输入该密码ssh-add
,但只要ssh-agent
正在运行,这将是您最后一次需要输入私钥的密码。
因为的 evalkeychain
设置了SSH_AUTH_SOCK
环境变量,所以的任何运行ssh
都将使用ssh-agent
来完成身份验证。
另一个建议是将keychain
执行添加到您的.bashrc
文件中,如此 StackExchange 答案。
要终止,keychain
只需输入命令:
keychain --stop mine
或者如果您想关闭的所有实例ssh-agent
,请输入以下命令:
keychain --stop all
请注意,使用诸如ssh-agent
通过将这些经过身份验证的密钥存储在内存中来破坏密码私钥文件的安全性的服务。这并不安全,尤其是在内存侧信道攻击的情况下。如果您对密钥安全性不感兴趣,更简单的解决方案是按照@vidarlo的建议删除私钥上的密码。
答案2
运行ssh-keygen -p
。这将允许您删除密钥上设置的密码。如果没有设置密码,它将以明文形式存储,您无需解锁即可使用它:
$ ssh-keygen -p
Enter file in which the key is (/home/user/.ssh/id_rsa):
Enter old passphrase:
Key has comment ''
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
当提示输入密码时,只需按 Enter 即可设置无密码。之后,您就可以自由使用您的密钥了。
答案3
简单的答案是“不”。
如果重启后仍保持这种状态,那就违背了目的(即保护)。
但是,您可以在登录会话甚至多个终端之间保持这种状态。
如果您希望跨登录会话维持,但可以每个终端输入一次密码,则添加
eval $(ssh-add)
到.bash_profile
如果您想要在每次系统重启时执行一次此操作,安装钥匙串,请更改您的
~/.ssh/config
文件以将钥匙串添加到钥匙串(AddKeysToAgent yes
)并执行上述步骤。