Skip to content

Instantly share code, notes, and snippets.

@CodeIter
Last active February 24, 2024 08:18
Show Gist options
  • Save CodeIter/00e7d464ab15a933614140b918298f8c to your computer and use it in GitHub Desktop.
Save CodeIter/00e7d464ab15a933614140b918298f8c to your computer and use it in GitHub Desktop.
Automatically load ssh keys in bash

Automatically load ssh keys : Add to .bashrc and configure environment variable.

export SSH_DIR="${HOME}/.ssh"
command mkdir -p "${SSH_DIR}"
if [[ -z "${SSH_AUTH_SOCK:-}" ]] ; then
  eval "$(ssh-agent -s)" >/dev/null 2>&1
  export SSH_AUTH_SOCK="${SSH_AUTH_SOCK}"
fi
export SSH_AGENT_LIFE=14400 # 4 hours
export SSHADD_OPTS=()
export PASS_SSH_ENTRY_PREFIX="_ssh"
if command -v pass &>/dev/null \
&& command -v gpg &>/dev/null \
; then
  for _public_key in "${SSH_DIR}"/*.pub ; do
    _private_key="${_public_key%.pub}"
    _entry="$(basename "${_private_key}")"
    if command pass ls "${PASS_SSH_ENTRY_PREFIX}/${_entry}" &>/dev/null ; then
      _fingerprint="$(command ssh-keygen -lf "${_public_key}" || true)"
      _loaded_keys="$(command ssh-add -l || true)"
      if ! command grep -qF -- "${_fingerprint}" < <(echo "${_loaded_keys}") ; then
        _ask="${SSH_DIR}/ssh-askpass.sh"
        (\
          echo '#!/usr/bin/env -S bash -euo pipefail' ; \
          echo ; \
          echo "command pass '${PASS_SSH_ENTRY_PREFIX}/${_entry}/password' | command head -n 1" \
        ) > "${_ask}"
        command chmod u+x "${_ask}"
        DISPLAY="${DISPLAY:-dummy}" \
        SSH_ASKPASS_REQUIRE=force \
        SSH_ASKPASS="${_ask}" \
        command ssh-add -t "${SSH_AGENT_LIFE}" "${SSHADD_OPTS[@]}" "${_private_key}"
      fi
    fi
  done
  command rm -f "${_ask}"
  [ -n "${_ask}" ] && echo
  unset _public_key _private_key _fingerprint _loaded_keys  _entry _ask
fi

My pass ssh entries: $ pass _ssh/

_ssh
└── id_termux
    ├── cipher
    ├── note
    ├── password
    ├── privateKey.priv
    └── publicKey.pub
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment