在登录时启动ssh-agent

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (210)

我有一个使用SSH别名的远程Gitrepo站点,从BitBucket.com中提取。我可以在我的服务器上手动启动ssh代理,但是每次我通过SSH登录时都必须这样做。

手动启动ssh代理:

eval ssh-agent $SHELL

然后添加代理:

ssh-add ~/.ssh/bitbucket_id

当我这样做的时候,它就会出现:

ssh-add -l

有什么方法可以使这个过程自动化,这样我就不必每次登录时都这么做了吗?服务器正在运行RedHat 6.2(Santiago)。

提问于
用户回答回答于

接受的解决办法有以下缺点:

  • 维护复杂;
  • 评估可能导致错误或安全漏洞的存储文件;
  • 它启动剂,但不停止它,这几乎等同于留在钥匙在点火。

如果您的密钥不需要键入密码,我建议如下解决方案。将以下内容添加到您的.bash_profile极尾(根据需要编辑密钥列表):

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

它有以下优点:

  • 更简单的解决办法;
  • 代理会话在bash会话结束时结束。

它可能有缺点:

  • 互动式ssh-add命令只影响一个会话,这实际上是一个非常不典型的情况下的问题;
  • 如果需要输入密码,则无法使用;
  • 已启动的shell变成非登录(这不会影响任何AFAIK)。

注意几个ssh-agent进程并不是一个缺点,因为它们不会占用更多的内存或CPU时间。

用户回答回答于

将以下内容添加到您的.bash_profile

SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

这个版本特别好,因为它将查看您是否已经启动ssh代理,如果它找不到它,将启动它并存储设置,以便下次启动shell时它们可以使用。

扫码关注云+社区

领取腾讯云代金券