dotfiles/agents/ensure-machine-agent
mwiegand 38f07179c4
agents: Bootstrap-Logik ins Repo, ein Script für beide Maschinen-Keys
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
2026-08-04 23:37:45 +02:00

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