SSH - 仅输入密码短语一次

时间:2014-08-06 05:55:59

标签: linux bash ssh zsh ssh-agent

$ ssh localhost,我被要求提供密码。每次登录都提供密码,这很麻烦,也很烦人。

所以,我用passphrase创建了ssh密钥..

$ ssh-keygen -t rsa

我已将~/.ssh/id_rsa.pub的内容复制到~/.ssh/authorized_keys

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

现在,$ ssh localhost我被要求提供密码短语。没有改进,但没有提供密码,而是提供密码

我遇到了Adding public key to ~/.ssh/authorized_keys does not log me in automatically,但它没有解决我的问题。 正如the comment所述,如果密钥是使用密码创建的,它将始终要求密码。

但是,如果 ssh键已创建没有密码短语,则任何ssh操作都不需要密码短语。

这篇文章的关键点是详细标记-v

debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>

在搜索PEM_read_PrivateKey failed时,我发现了很多帖子,其中几个来自stackoverflow本身。

但找不到合适的解决方案。

然后我遇到Setting up passwordless, passphraseless ssh,其中说明了使用ssh代理自动输入密码短语。

$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa

$ eval `ssh-agent` && ssh-add ~/.ssh/id_rsa

但同样,它只针对该特定会话解决了。每次我开始一个新的会话时,我都必须执行

$ eval `ssh-agent` && ssh-add ~/.ssh/id_rsa

我可以将它添加到我的.bashrc或.zshrc中,但是为每个会话输入密码都很烦人。

有没有办法在会话中使用相同的ssh-agent?

1 个答案:

答案 0 :(得分:2)

为了解决交叉会话ssh-agent,必须理解

$ eval `ssh-agent` && ssh-add ~/.ssh/id_rsa

在执行ssh-agent时,它会向STDOUT

输出少量 unix命令
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-qtCEoF3298/agent.3298; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3299; export SSH_AGENT_PID;
echo Agent pid 3299;

评估eval - command将执行命令的输出

因此,eval`ssh-agent`会转换为

$ SSH_AUTH_SOCK=/tmp/ssh-qtCEoF3298/agent.3298; export SSH_AUTH_SOCK; SSH_AGENT_PID=3299; export SSH_AGENT_PID; echo Agent pid 3299;

以上语句设置环境变量 SSH_AUTH_SOCK SSH_AGENT_PID ,并将代理程序的进程ID 打印到{{1 }}

环境变量 SSH_AUTH_SOCK指向UNIX套接字

STDOUT

对于任何其他$ file $SSH_AUTH_SOCK /tmp/ssh-qtCEoF3298/agent.3298: socket 操作,它会查找此套接字,如果存在则使用它或要求密码短语。但是,在使用之前,此套接字需要经过身份验证。这是通过添加身份

来完成的
ssh

由于环境变量SSH_AUTH_SOCK已导出,因此它可用于源自此shell的任何shell,但不适用于任何新登录

然后我遇到Understanding ssh-agent and ssh-add引导到ssh-find-agent.bash

ssh-find-agent.bash查找所有实时代理套接字并将其导出为环境变量。

根据Jon Cairns的建议,在帖子中。

  
    

将其下载到可访问的地方(例如〜/ .ssh-find-agent)并将以下内容添加到shell的配置文件中(例如〜/ .bashrc,〜/ .zshrc):***

         

$ ssh-add ~/.ssh/id_rsa

         

source ~/.ssh-find-agent/ssh-find-agent.bash

  

这就是我一直在寻找的解决方案

我修改了函数名称,以符合我的偏好,同样可以在ssh-auth-sock找到 与set_ssh_agent_socketGPG和&amp;我的目的不需要GNOME。该脚本需要重构。

此外,OSX有自己的钥匙串。 Thus I execute these functions only for Linux

我还创建了一个alias for eval ssh-agent && ssh-add ~/.ssh/id_rsa 更快来键入整个命令。