aboutsummaryrefslogtreecommitdiffstats
path: root/hyperterm/tools/ssh-agent.sh
blob: e121722d9660ea99baf9d60fc202277ea601c9a0 (plain)
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
#!/bin/bash

#------------
# SSH-AGENT
#------------
function sshagent_start {

    # clean previous ssh credentials
    (rm -rf /tmp/ssh-* > /dev/null)

    SSH_ENV="$HOME/.ssh/environment"
    printf '\e[1;36m%s\e[m\n' "Initialising new SSH agent..."
    ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    chmod 600 "${SSH_ENV}"
    # shellcheck source=/dev/null
    source "${SSH_ENV}" > /dev/null

    # Set the default time to 5 days if not provided
    local days="${1:-5d}"

    ssh-add -t "$days"
    printf '\e[1;36m%s\e[m\n' "succeeded"
}

function sshagent_stop {

    # clean previous ssh credentials
    (rm -rf /tmp/ssh-* > /dev/null)

    ssh-agent -k > /dev/null
}

function sshagent_findsockets {
    find /tmp -uid "$(id -u)" -type s -name agent.\* 2>/dev/null
}

function sshagent_testsocket {
    if [ ! -x "$(command -v ssh-add)" ] ; then
        echo "ssh-add is not available; agent testing aborted"
        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!"
            rm -f "$SSH_AUTH_SOCK"
            return 4
        else
            echo "Found ssh-agent $SSH_AUTH_SOCK"
            return 0
        fi
    else
        echo "$SSH_AUTH_SOCK is not a socket!"
        return 3
    fi
}

function sshagent_reload {
    # 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 sshagent_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 $(sshagent_findsockets) ; do
            if [ $AGENTFOUND != 0 ] ; then break ; fi
            if sshagent_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

    # Finally, show what keys are currently in the agent
    ssh-add -l
}

if [[ -f "$HOME/.ssh/environment" ]]; then
    sshagent_reload > /dev/null
fi

# Alias agents
alias sagent_start="sshagent_start"
alias sagent_stop="sshagent_stop"

# Clean up not global functions
unset -f sshagent_findsockets sshagent_testsocket