ssh-agent需要在我的服务器上每次启动

我已经使用这个bitbucket教程提供SSH访问的Git仓库: https ://confluence.atlassian.com/pages/viewpage.action?pageId=270827678

但是现在,每次我想要使用git时,都会说我没有权限,直到我这样做:

ssh-agent /bin/bash && ssh-add ~/.ssh/id_rsa 

为什么会这样呢? 我在本地机器上轻松完成,但是远程服务器不能正常工作。

更新

当我做

 ssh-agent 

我明白了

 SSH_AUTH_SOCK=/tmp/ssh-blGr6z5dJjit/agent.14183; export SSH_AUTH_SOCK; SSH_AGENT_PID=14184; export SSH_AGENT_PID; echo Agent pid 14184; 

但比我试图做混帐取,我得到这个:

 Permission denied (publickey). fatal: The remote end hung up unexpectedly 

即使我添encryption钥后

 ssh-add ~/.ssh/bitbucket 

我得到这个错误

 Could not open a connection to your authentication agent. 

这个问题有点不清楚,所以这个答案可能真的是一个不同的问题。 但是由于答案可能对其他人有用,所以我觉得值得留意。

当你inputssh-agent /bin/bash一个ssh-agent的实例,只要这个shell是活动的,它将一直运行。 默认情况下,ssh-agent将仅被该shell使用,并且一旦closures该shell就会终止。

如果您只需键入ssh-agent ,则代理将在后台启动,即使closures该shell,该代理也将继续运行。 ssh-agent命令将在stdout上打印命令,可以input该命令以开始使用该ssh-agent。 你将不得不每次input这些命令。

你可以通过键入eval $(ssh-agent)来启动一个后台的ssh-agent并开始在当前的shell中使用它。 但是,如果您再次login,则必须将SSH_AUTH_SOCK环境variables存储在某个地方并进行设置。

有了这样的背景信息,我有三个build议,如何去总是有代理人可用。

  • 在服务器上使用屏幕会话。 当你启动屏幕typeseval $(ssh-agent) ; screen eval $(ssh-agent) ; screen ,该代理将继续在服务器上运行,如果稍后再次连接到该屏幕,它仍将记住要使用的代理。
  • ~/.bash_profile文件中插入命令以查找活动代理(如果存在)并设置SSH_AUTH_SOCK环境variables。
  • 使用ssh代理转发来使用客户端上的代理而不是服务器上的代理。 在使用它之前,确保你了解了这个安全性的含义。

~/.bash_profile查找ssh-agent可以用一个像这样的脚本来完成

 #!/bin/bash for P in /tmp/ssh-*/agent.* do if [ -O "$P" ] && [ -O "$(dirname "$P")" ] then L=$(SSH_AUTH_SOCK="$P" timeout 1s ssh-add -l > >(wc -l)) case $? in 0) echo "$L $P" ;; 1) echo "0 $P" ;; esac fi & done | sort -rn | if read NP then echo "SSH_AUTH_SOCK='$P'; export SSH_AUTH_SOCK" else ssh-agent fi 

可以从~/.bash_profile调用这个eval $(find-agent) (假设脚本被命名为find-agent)。

ssh命令可能会失败,错误消息Permission denied (publickey). ,但如果您事先将相同的密钥加载到代理程序中,如果您错误地configuration了ssh客户端,则会工作。

默认情况下, sshssh-add会从相同的位置加载密钥,所以两者都会find所需的密钥,或者都不会find它。 但是在/etc/ssh/ssh_config~/.ssh/config ,您可以通过IdentityFile设置覆盖ssh使用的path。

如果~/.ssh/config包含错误的IdentityFile设置,您将看到您的文章中描述的症状。