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