Files
OZM-Keks-Handbuch-v1/ssh-agent-screenlock_v4.sh
2025-12-12 20:32:14 +01:00

100 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
#
# SSH-Agent Neustart beim Bildschirmschoner (MATE Desktop)
# Dieses Script startet den ssh-agent neu, wenn der Bildschirm gesperrt wird
#
LOG_FILE="$HOME/.ssh-agent-screenlock.log"
SOCKET_PATH="$HOME/.ssh/agent.sock"
# Check for existing instance
pid_file="$HOME/.ssh-agent-watchdog.pid"
if [ -f "$pid_file" ]; then
old_pid=$(cat "$pid_file")
if kill -0 "$old_pid" 2>/dev/null; then
echo "Watchdog läuft bereits (PID: $old_pid). Beende alte Instanz..."
kill "$old_pid"
fi
fi
echo $$ > "$pid_file"
STOP_LOCK="$HOME/.ssh-agent-watchdog.pause"
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
restart_ssh_agent() {
# Check if we are "paused" for large transfers
if [ -f "$STOP_LOCK" ]; then
log_message "SKIP: Bildschirm gesperrt, aber 'Deep Work' Modus aktiv (Pause-File gefunden)."
return
fi
log_message "Bildschirm gesperrt - SSH-Agent wird neu gestartet"
# Alte ssh-agent Prozesse beenden
if [ -n "$SSH_AGENT_PID" ]; then
kill "$SSH_AGENT_PID" 2>/dev/null
log_message "SSH-Agent PID $SSH_AGENT_PID beendet"
fi
# Alle ssh-agent Prozesse des aktuellen Users beenden
pkill -u "$USER" ssh-agent
# SSH-Agent Umgebungsvariablen löschen
unset SSH_AUTH_SOCK
unset SSH_AGENT_PID
# Alten Socket entfernen, falls vorhanden
rm -f "$SOCKET_PATH"
# Neuen ssh-agent starten und direkt an fixen Pfad binden
# -a: bind address (socket path)
eval "$(ssh-agent -a "$SOCKET_PATH" -s)" > /dev/null 2>&1
# Check if agent started successfully
if [ -z "$SSH_AGENT_PID" ]; then
log_message "FEHLER: SSH-Agent konnte nicht gestartet werden"
return
fi
# Umgebungsvariablen in Datei speichern für andere Terminals
# Dateiname angepasst an .bashrc des Users: ~/.ssh/agent-environment
cat > "$HOME/.ssh/agent-environment" <<EOF
export SSH_AUTH_SOCK=$SOCKET_PATH
export SSH_AGENT_PID=$SSH_AGENT_PID
EOF
log_message "Neuer SSH-Agent gestartet (PID: $SSH_AGENT_PID, Socket: $SOCKET_PATH)"
}
# Cleanup bei Script-Ende
cleanup() {
rm -f "$pid_file"
log_message "Watchdog beendet."
exit 0
}
trap cleanup SIGINT SIGTERM
# Sicherstellen, dass der Bildschirmschoner auch wirklich sperrt
gsettings set org.mate.screensaver lock-enabled true 2>/dev/null
# Grace-Period abschalten (Sofort sperren)
gsettings set org.mate.screensaver lock-delay 0 2>/dev/null
log_message "Bildschirm-Sperre erzwungen (lock-enabled true, lock-delay 0)"
log_message "Watchdog gestartet (PID $$)."
# Auf MATE Screensaver Events hören
dbus-monitor --session "type='signal',interface='org.mate.ScreenSaver',member='ActiveChanged'" 2>/dev/null |
while read -r line; do
if echo "$line" | grep -q "boolean true"; then
# Sofort sperren anfordern, falls noch nicht geschehen
mate-screensaver-command --lock 2>/dev/null
restart_ssh_agent
# TODO: Idee - Terminal Hintergrund ändern via DBus (sehr spezifisch für Mate Terminal)
# Experimentell: gsettings set org.mate.terminal.profile:/org/mate/terminal/profiles/default/ background-color '#000000'
fi
done