Skip to content

Snippets

Simon Chapman edited this page Mar 20, 2026 · 4 revisions
env="$HOME/.ssh/agent.env"
export SSH_AUTH_SOCK="/tmp/ssh-agent.$USER"
export SSH_AGENT_PID=""

agent_is_running() {
    [ -n "$SSH_AUTH_SOCK" ] || return 1

    ssh-add -l >/dev/null 2>&1
    rc=$?
    [ "$rc" -eq 0 ] || [ "$rc" -eq 1 ]
}

agent_load_env() {
    if [ -f "$env" ]; then
        . "$env" 2>/dev/null
    fi
}

agent_start() {
    # unique socket path avoids collisions
    export SSH_AUTH_SOCK="/tmp/ssh-agent.$USER.$$"

    # remove old socket if leftover
    [ -S "$SSH_AUTH_SOCK" ] && rm -f "$SSH_AUTH_SOCK"

    echo "[debug] starting CLEAN agent at $SSH_AUTH_SOCK"
    ( umask 077; ssh-agent -a "$SSH_AUTH_SOCK" -s > "$env" )
    . "$env" 2>/dev/null
}

add_keys_if_present() {
    local keys=()
    for k in "$HOME"/.ssh/*_rsa "$HOME"/.ssh/id_rsa; do
        [ -f "$k" ] && keys+=("$k")
    done
    [ ${#keys[@]} -gt 0 ] && ssh-add "${keys[@]}"
}

# --- main ---

agent_is_running || agent_load_env

if ! agent_is_running; then
    agent_start
fi

if ! agent_is_running; then
    echo "[debug] FAILED: agent still not running"
else
    if ! ssh-add -l >/dev/null 2>&1; then
        add_keys_if_present
    fi
fi

unset env

Clone this wiki locally