Die imperative Hälfte der Key-Architektur lag unversioniert in ~/.zshrc und ~/.local/bin, während die deklarative (.env.agents) getrackt war. Jetzt liegt alles Agent-bezogene hier: - agents/agent-env.zsh — SSH_AUTH_SOCK + agent-env(), gesourced von .zshrc - agents/ensure-machine-agent — startet den Maschinen-Agent und stellt beide Keys sicher (ersetzt load-signing-key, das nur den Signing-Key kannte, während agent-env separat den Agent-Key lud) - agents/README.md — Design-Doc, verschoben aus dem ai-Repo zum Code .env.agents bleibt rein deklarativ, weil op run --env-file die Datei nur parst und keinen Code ausführt — daher die Zweiteilung. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012aD7fG6BpN1HchyHeNXZb4
50 lines
1.9 KiB
Bash
Executable file
50 lines
1.9 KiB
Bash
Executable file
#!/bin/sh
|
|
# Stellt den geteilten Maschinen-ssh-agent sicher: Socket läuft und hält beide
|
|
# Keys, die auf dieser Maschine gebraucht werden. Idempotent — mehrfach
|
|
# aufrufbar, macht nur was fehlt.
|
|
#
|
|
# SSH isac agent SSH auf interne Systeme (User mwiegand-agent)
|
|
# SSH Signing Key Git-Signing, für mich UND Agent-Sessions
|
|
#
|
|
# Wird von agent-env bei jedem Start gerufen; manuell nur nötig, wenn man nach
|
|
# einem Reboot committen will, bevor die erste Agent-Session lief (Symptom:
|
|
# "error: Couldn't find key in agent?").
|
|
#
|
|
# Der kundenfähige Haupt-Key ("SSH Key mwiegand") gehört bewusst NICHT hierher:
|
|
# er lebt nur hinter der 1Password-Freigabe (~/.1password/agent.sock, siehe
|
|
# Host * in ~/.ssh/config), damit Agents ihn nicht unbemerkt nutzen können.
|
|
# Architektur und Begründungen: agents/README.md im dotfiles-Repo.
|
|
|
|
PATH="/opt/homebrew/bin:/usr/bin:/bin:$PATH"
|
|
SOCK="$HOME/.ssh/isac-agent.sock"
|
|
OP_ACCOUNT="WHZOJQOJPZHTFPJC6JZAOCUCBI"
|
|
export SSH_AUTH_SOCK="$SOCK"
|
|
|
|
# Agent tot oder nie gestartet? (ssh-add exit 2 = Socket antwortet nicht)
|
|
ssh-add -l >/dev/null 2>&1
|
|
if [ $? -eq 2 ]; then
|
|
rm -f "$SOCK"
|
|
/usr/bin/ssh-agent -a "$SOCK" >/dev/null || exit 1
|
|
fi
|
|
|
|
# $1 = Fingerprint (schon geladen?), $2 = op-Referenz, $3 = Anzeigename
|
|
ensure_key() {
|
|
if ssh-add -l 2>/dev/null | grep -q "$1"; then
|
|
return 0
|
|
fi
|
|
if op read --account "$OP_ACCOUNT" "$2" | ssh-add -q -; then
|
|
echo "$3 geladen (bis zum nächsten Reboot)." >&2
|
|
else
|
|
echo "$3 konnte nicht geladen werden (1Password gesperrt?)" >&2
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
rc=0
|
|
ensure_key "SHA256:SvHSJQcHlAWUmF8EnflNsrv0mhWGARvAKLRPSBQ460I" \
|
|
"op://Employee/37z2tbpilrjrgyrhckb5cbrhsq/private key?ssh-format=openssh" \
|
|
"Signing-Key" || rc=1
|
|
ensure_key "SHA256:77FiJM6Z1eN7Ka7YpoCKIn9xVJFQUj6nBQa/g1rFya4" \
|
|
"op://Employee/ec2mtn4kkxnypyc4gxutg7lajq/private key?ssh-format=openssh" \
|
|
"Agent-Key" || rc=1
|
|
exit $rc
|