forked from colonelpanic/dotfiles
84 lines
2.2 KiB
Bash
84 lines
2.2 KiB
Bash
#!/bin/bash
|
|
# acquired courtesy of
|
|
# http://superuser.com/questions/141044/sharing-the-same-ssh-agent-among-multiple-login-sessions#answer-141241
|
|
|
|
function sshag_findsockets {
|
|
find /tmp -uid $(id -u) -type s -name agent.\* 2>/dev/null
|
|
}
|
|
|
|
function sshag_testsocket {
|
|
if [ ! -x "$(which ssh-add)" ] ; then
|
|
echo "ssh-add is not available; agent testing aborted" >&2
|
|
return 1
|
|
fi
|
|
|
|
if [ X"$1" != X ] ; then
|
|
export SSH_AUTH_SOCK=$1
|
|
fi
|
|
|
|
if [ X"$SSH_AUTH_SOCK" = X ] ; then
|
|
return 2
|
|
fi
|
|
|
|
if [ -S $SSH_AUTH_SOCK ] ; then
|
|
ssh-add -l > /dev/null
|
|
if [ $? = 2 ] ; then
|
|
echo "Socket $SSH_AUTH_SOCK is dead! Deleting!" >&2
|
|
rm -f $SSH_AUTH_SOCK
|
|
return 4
|
|
else
|
|
return 0
|
|
fi
|
|
else
|
|
echo "$SSH_AUTH_SOCK is not a socket!" >&2
|
|
return 3
|
|
fi
|
|
}
|
|
|
|
function sshag_init {
|
|
# ssh agent sockets can be attached to a ssh daemon process or an
|
|
# ssh-agent process.
|
|
|
|
AGENTFOUND=0
|
|
|
|
# Attempt to find and use the ssh-agent in the current environment
|
|
if sshag_testsocket ; then AGENTFOUND=1 ; fi
|
|
|
|
# If there is no agent in the environment, search /tmp for
|
|
# possible agents to reuse before starting a fresh ssh-agent
|
|
# process.
|
|
if [ $AGENTFOUND = 0 ] ; then
|
|
for agentsocket in $(sshag_findsockets) ; do
|
|
if [ $AGENTFOUND != 0 ] ; then break ; fi
|
|
if sshag_testsocket $agentsocket ; then AGENTFOUND=1 ; fi
|
|
done
|
|
fi
|
|
|
|
# If at this point we still haven't located an agent, it's time to
|
|
# start a new one
|
|
if [ $AGENTFOUND = 0 ] ; then
|
|
eval `ssh-agent`
|
|
fi
|
|
|
|
# Clean up
|
|
unset AGENTFOUND
|
|
unset agentsocket
|
|
|
|
{ echo "Keys:"; ssh-add -l | sed 's/^/ /'; } >&2
|
|
|
|
# Display the found socket
|
|
echo $SSH_AUTH_SOCK;
|
|
}
|
|
|
|
|
|
# If we are not being sourced, but rather running as a subshell,
|
|
# let people know how to use the output.
|
|
if [[ $0 =~ sshag ]]; then
|
|
echo 'Output should be assigned to the environment variable $SSH_AUTH_SOCK.' >&2
|
|
sshag_init
|
|
# Otherwise, make it convenient to invoke the search.
|
|
# When the alias is invoked, it will modify the shell environment.
|
|
else
|
|
alias sshag="sshag_init"
|
|
fi
|