#!/usr/bin/env bash # gpg-ssh-key-load # # Load the SSH key stored in gopass into the gpg-agent. # # SSH keys are served by gpg-agent (enable-ssh-support): the private key at # @@GOPASS_SSH_KEY@@ in the gopass store is added to the agent, so ssh works # without ever needing a ~/.ssh directory. It runs automatically during every # home-manager switch and exits early when the agent already holds an identity, # so the gpg passphrase prompt only appears when it is actually needed. set -o errexit set -o nounset set -o pipefail export GNUPGHOME="@@GNUPGHOME@@" GOPASS_SSH_KEY="@@GOPASS_SSH_KEY@@" info() { printf '\033[1;34m==>\033[0m %s\n' "$*"; } warn() { printf '\033[1;33m==> warning:\033[0m %s\n' "$*" >&2; } error() { printf '\033[1;31m==> error:\033[0m %s\n' "$*" >&2; } die() { error "$*"; exit 1; } usage() { cat </dev/null | grep -qE "(ED25519|RSA|ECDSA)"; then exit 0 fi if ! gopass show -o "$GOPASS_SSH_KEY" > /dev/null 2>&1; then die "no gopass entry $GOPASS_SSH_KEY" fi tmpdir=$(mktemp -d) trap 'rm -rf "$tmpdir"' EXIT keyfile="$tmpdir/key" gopass show -o "$GOPASS_SSH_KEY" > "$keyfile" 2>/dev/null chmod 600 "$keyfile" passphrase=$(gopass show -o "$GOPASS_SSH_KEY/passphrase" 2>/dev/null || true) if [ -n "$passphrase" ]; then ssh-keygen -p -P "$passphrase" -N "" -f "$keyfile" 2>/dev/null fi info "Loading SSH key ($GOPASS_SSH_KEY) into gpg-agent..." if ! timeout 60 ssh-add "$keyfile"; then error "Failed to load SSH key into gpg-agent." error "Run \"ssh-add <(gopass show -o $GOPASS_SSH_KEY)\" manually." exit 1 fi info "SSH key loaded into gpg-agent."