maximkv25
@maximkv25
web-developer

Из-за чего ssh-agent не находит ключ при новой сессии терминала?

Добрый день,

добавляю ssh ключ Документация bitbucket, на этом этапе все гладко и ssh работает, но при заходе на сервер снова (разлогин текущей сессии терминала) получаю ошибку
$git ls-remote

repository access denied.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.


замечу что eval 'ssh-agent' не работает
root@vm107833:/home/b/frontend# eval 'ssh-agent'
SSH_AUTH_SOCK=/tmp/ssh-J4mjc2fCUI2r/agent.29034; export SSH_AUTH_SOCK;
SSH_AGENT_PID=29035; export SSH_AGENT_PID;
echo Agent pid 29035;


приходится использовать
exec ssh-agent bash

Как решить данную проблему?
  • Вопрос задан
  • 1047 просмотров
Решения вопроса 1
maximkv25
@maximkv25 Автор вопроса
web-developer
Нужно добавить хост bibucket в ssh config
Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/id_rsa

Решение
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@ashumkin
системный разработчик
происходит это потому, что ssh-agent запускаясь, выдаёт имя сокета, который задаётся в переменную окружения SSH_AUTH_SOCK (ssh-agent bash облегчает эту задачу, выдавая его в виде, пригодном для исполнения в bash/shell). Они "теряются" при перелогине. Так что, чтобы подключиться к ранее запущенному ssh-agent'у, нужно восстановить путь к его сокету.
Как это сделать? Например, так:
https://gist.github.com/martijnvermaat/8070533

Upd.
я себе сделал так (в ~/.bash_functions)
function __ssh_agent_find_sockets() {
    local user=$(whoami)
    find /tmp/ssh-* -user "$user" -name agent\* -printf '%T@ %p\n' 2>/dev/null | sort -k 1nr | sed 's/^[^ ]* //'
}

function __ssh_agent_restore() {
    local found_socket=$(__ssh_agent_find_sockets | head -n 1)
    export SSH_AUTH_SOCK="$found_socket"
}

function __ssh_agent_socket() {
    # set up SSH agent socket symlink
    export SSH_AUTH_SOCK_LINK="/tmp/ssh-$USER/agent"
    if ! [ -r $(readlink -m $SSH_AUTH_SOCK_LINK) ] && [ -r $SSH_AUTH_SOCK ]
    then
        mkdir -p "$(dirname $SSH_AUTH_SOCK_LINK)" \
            && chmod go= "$(dirname $SSH_AUTH_SOCK_LINK)" \
            && ln -sfn $SSH_AUTH_SOCK $SSH_AUTH_SOCK_LINK
    fi
}
function __ssh_agent_run_do() {
    eval $(ssh-agent -s)
}

function __ssh_agent_run() {
    test -z "$SSH_AUTH_SOCK" && __ssh_agent_run_do
    __ssh_agent_socket
return
}


а в ~/.bashrc:
source ~/.bash_functions
...
__ssh_agent_run
...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы