происходит это потому, что
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
...