-
Notifications
You must be signed in to change notification settings - Fork 2
/
.auth_sockrc
114 lines (97 loc) · 3.2 KB
/
.auth_sockrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/bin/env bash
if type ssh-add >/dev/null 2>&1; then
alias as_register='echo -n $SSH_AUTH_SOCK > $SOCKPATH'
alias as_use='export SSH_AUTH_SOCK=$(cat $SOCKPATH)'
alias as_revert='export SSH_AUTH_SOCK=$OLD_AUTH_SOCK'
alias as_start='eval $(ssh-agent); as_register'
VARS="SOCKDIR SOCKFILE ABORT NEW_AUTH_SOCK SOCKCODE VARS PID AGENTS AGENTCOUNT"
# Set up READLINK
source "$(dirname -- "$BASH_SOURCE")/.toolslib/readlink.sh"
# Steps:
# - Check to see if SSH_AUTH_SOCK is set and usable
# - Check to see if $SOCKPATH has a usable socket
# - Use find(8) to find open sockets
# - Start a new ssh-agent
test_auth_sock() {
SOCKFILE=$1
if test "xx$SOCKFILE" = "xx"; then
return 1
fi
if ls "$SOCKFILE" &>/dev/null; then
# The following perl blurb grabs the pid out of a string like:
# /tmp/ssh-qeedRuu2jHmL/agent.23886
# and then increments it, since (at least on linux) the socket pid
# is the parent pid (not the daemon pid)
SSHPID=$(echo -n $SOCKFILE |
perl -ne 's/^.*agent\.(\d*)/$1/; print;')
if [ "$SSHPID" = "$SOCKFILE" ]; then
return 4 # Unknown path type
fi
AGENTPID=$(($SSHPID+1))
# If the regex matched a pid
if test \( "xx$AGENTPID" != "xx" \) -o \( "xx$SSHPID" != "xx" \) ; then
# If neight AGENTPID or SSHPID are running, return 3
ps -p $AGENTPID &>/dev/null || ps -p $SSHPID &>/dev/null || return 3
else
return 100
fi
else
return 2
fi
}
SOCKDIR=~/.ssh/agent_socks
SOCKPATH="$SOCKDIR/$(hostname -s).auth_sock"
OLD_AUTH_SOCK=$SSH_AUTH_SOCK
mkdir -p $SOCKDIR
touch $SOCKPATH
ABORT=0
NEW_AUTH_SOCK=$(cat $SOCKPATH)
test_auth_sock "$NEW_AUTH_SOCK"
SOCKCODE=$?
if test $SOCKCODE -eq 0; then
SSH_AUTH_SOCK=$NEW_AUTH_SOCK
elif test $SOCKCODE -eq 100; then
echo "Unknown socket format. Aborting."
ABORT=1
else
test_auth_sock $SSH_AUTH_SOCK
if test $? -ne 0; then
unset SSH_AUTH_SOCK
fi
fi
if test -z "$SSH_AUTH_SOCK" ; then
# Find agent socks
AGENTS=$(find $TMPDIR/ssh-* -user $USER -type s 2>/dev/null)
AGENTCOUNT=$(echo $AGENTS | wc -w)
if test $AGENTCOUNT -eq 0 ; then
#echo "Unable to find SSH agent"
echo -n
elif test $AGENTCOUNT -gt 1 ; then
#echo "Multiple SSH agents found, bailing."
echo -n
elif type pgrep 2>&1 >/dev/null && test ! -z "$READLINK" && type lsof 2>&1 >/dev/null; then
PGREPIDS=$(pgrep -u $(whoami) ssh-agent)
COUNT=$(echo $PGREPIDS | wc -l)
if test $? == 0 -a $COUNT -eq 1 ; then
PGREPATH=$($READLINK $AGENTS)
if test $? -eq 0; then
export SSH_AUTH_SOCK=$PGREPATH
fi
fi
elif [[ "$READLINK" != "" ]] ; then
if test $AGENTCOUNT == 1; then
export SSH_AUTH_SOCK=$($READLINK $AGENTS)
fi
fi
fi
if test -z "$SSH_AUTH_SOCK" && test $AGENTCOUNT -gt 1 ; then
echo "Multiple ssh-agents found, unable to continue"
elif test -z "$SSH_AUTH_SOCK" && test $ABORT -eq 0 ; then
echo "Couldn't find ssh-agent. Use as_start to start one."
fi
export SSH_AUTH_SOCK
echo -n $SSH_AUTH_SOCK > $SOCKPATH
for VAR in "$VARS"; do
unset $VAR
done
fi