From 80a5394548fd0230ccb39246e653073cd3861130 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Fri, 22 May 2026 15:17:39 +0200 Subject: [PATCH] Initial commit --- .gitignore | 1 + README.md | 101 +++++++++++++++++++++++++ shell_ntfy_remote_shutdown.env | 15 ++++ shell_ntfy_remote_shutdown.sh | 134 +++++++++++++++++++++++++++++++++ 4 files changed, 251 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 shell_ntfy_remote_shutdown.env create mode 100644 shell_ntfy_remote_shutdown.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f2a24d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +shell_ntfy_remote_shutdown.env.own diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f1120b --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +## Skript zum herunterfahren einer entfernten Computers + +Dieses Skript automatisiert das Herunterfahren eines Servers per SSH und sendet anschließend eine Benachrichtigung an einen NTFY-Server. + +Für die Benachrichtigungen wird `curl` verwendet. +Das Herunterfahren erfolgt per `ssh`. Dafür muss zuvor ein SSH-Key zwischen den Systemen ausgetauscht werden. + +### Funktionen + +- Sendet eine Benachrichtigung an einen NTFY-Server mit benutzerdefinierten Details. +- Führt das Herunterfahren eines Servers über SSH durch. +- Lädt Konfigurationsvariablen aus einer externen .env-Datei. + +### Voraussetzungen + +`curl` Benötigt für das Senden von HTTP-Anfragen. +`NTFY` Ein NTFY-Server für Benachrichtigungen + +### Installation + +1. Stellen Sie sicher, dass `curl` auf Ihrem System installiert sind: +```bash +sudo apt install curl +``` +2. Platzieren Sie das Skript und eine .env-Datei im gleichen Verzeichnis. Die .env-Datei muss denselben Namen wie das Skript haben, jedoch mit der Endung .env (z. B. shell_ntfy_remote_shutdown.sh und shell_ntfy_remote_shutdown.env). +3. Setzen Sie die korrekten Dateiberechtigungen, um die Sicherheit zu gewährleisten: +```bash +chmod 700 shell_ntfy_remote_shutdown.sh +chmod 600 shell_ntfy_remote_shutdown.env +chmod +x shell_ntfy_remote_shutdown.sh +``` + +### Konfiguration + +Erstellen Sie eine `.conf`-Datei mit den folgenden Variablen: +```bash +# NTFY Server +NTFY_URL=https://ntfy.server.net/ +AUTH_TOKEN=tk_ntfytoken + +# Duplicati Server +DUPLICATI_URL=http://192.168.178.100:8200 +SERVER_NAME=unRAID + +# NTFY Icon (Optional / Leer lassen falls nicht benötigt) +ICON=http://192.168.178.25:3030/icons/qnap-ts-412.png + +# Entfernter Computer +SSH_HOST=192.168.178.105 +SSH_USER=admin +SSH_KEY=/config/.ssh/id_ed25519 +``` + +### Beschreibung der Variablen + +```bash +NTFY_URL: Die Basis-URL des NTFY-Servers. +AUTH_TOKEN: Authentifizierungstoken für den NTFY-Server. +DUPLICATI_URL: URL zum Öffnen des Duplicati-Backup-Dashboards. +SERVER_NAME: Anzeigename des Servers. +ICON: URL für das Benachrichtigungssymbol. +SSH_HOST: Hostname oder IP-Adresse des Servers. +SSH_USER: Benutzername für die SSH-Anmeldung. +SSH_KEY: Pfad zum privaten SSH-Key. +``` + + +### SSH-Key erstellen und austauschen + +Für die passwortlose SSH-Anmeldung muss zunächst ein SSH-Key erzeugt und auf das Zielsystem kopiert werden. + +#### 1. SSH-Key erstellen + +```bash +ssh-keygen -t ed25519 +``` +Dadurch werden folgende Dateien erzeugt: + +```bash +~/.ssh/id_ed25519 +~/.ssh/id_ed25519.pub +``` + +#### 2. Public Key auf das Zielsystem kopieren + +```bash +ssh-copy-id -i ~/.ssh/id_ed25519.pub USER@HOST +``` + +Beispiel: + +```bash +ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@192.168.178.105 +``` + + +### Verwendung des Scripts +- Führen Sie das Skript aus: +```bash +./shell_ntfy_remote_shutdown.sh +``` diff --git a/shell_ntfy_remote_shutdown.env b/shell_ntfy_remote_shutdown.env new file mode 100644 index 0000000..3631008 --- /dev/null +++ b/shell_ntfy_remote_shutdown.env @@ -0,0 +1,15 @@ +# NTFY Server +NTFY_URL=https://ntfy.server.net/ +AUTH_TOKEN=tk_ntfytoken + +# Duplicati Server +DUPLICATI_URL=http://192.168.178.100:8200 +SERVER_NAME=unRAID + +# NTFY Icon (Optional / Leer lassen falls nicht benötigt) +ICON=http://192.168.178.25:3030/icons/qnap-ts-412.png + +# Entfernter Computer +SSH_HOST=192.168.178.105 +SSH_USER=admin +SSH_KEY=/config/.ssh/id_ed25519 \ No newline at end of file diff --git a/shell_ntfy_remote_shutdown.sh b/shell_ntfy_remote_shutdown.sh new file mode 100644 index 0000000..45ee3e1 --- /dev/null +++ b/shell_ntfy_remote_shutdown.sh @@ -0,0 +1,134 @@ +#!/bin/bash + +set -u + +# Pfad zur .env-Datei dynamisch ermitteln +ENV_FILE="$(dirname "$(realpath "$0")")/$(basename "$0" .sh).env" + +# Prüfen, ob die .env-Datei existiert +if [[ ! -f "$ENV_FILE" ]]; then + echo "Fehler: Konfigurationsdatei $ENV_FILE nicht gefunden." + exit 1 +fi + +# .env-Datei laden +source "$ENV_FILE" + +SSH_TARGET="$SSH_USER@$SSH_HOST" + +echo "Starte Shutdown von $SSH_TARGET ..." + +# Mögliche Shutdown-Kommandos für alte QNAPs / Linux-Systeme +SHUTDOWN_COMMANDS=( + "poweroff" + "/sbin/poweroff" + "shutdown now" + "/sbin/shutdown now" + "halt" + "/sbin/halt" + "init 0" +) + +shutdown_success=false +successful_command="" +ssh_error="" + +for cmd in "${SHUTDOWN_COMMANDS[@]}"; do + echo "Teste: $cmd" + + ssh_output=$( + ssh \ + -i "$SSH_KEY" \ + -o ConnectTimeout=10 \ + -o BatchMode=yes \ + -o StrictHostKeyChecking=no \ + "$SSH_TARGET" "$cmd" 2>&1 + ) + + exit_code=$? + + echo "$ssh_output" + + # Erfolgreich ausgeführt + if [[ $exit_code -eq 0 ]]; then + echo "Shutdown erfolgreich mit: $cmd" + + shutdown_success=true + successful_command="$cmd" + break + fi + + # Viele Systeme schließen SSH sofort beim Shutdown + if echo "$ssh_output" | grep -qiE "connection closed|broken pipe|connection reset"; then + echo "SSH-Verbindung beim Shutdown getrennt: $cmd" + + shutdown_success=true + successful_command="$cmd" + break + fi + + ssh_error="$ssh_output" + + sleep 2 +done + +# NTFY Nachricht vorbereiten +if [[ "$shutdown_success" == true ]]; then + TITLE="Backups beendet" + MESSAGE="QNAP wird heruntergefahren. + + Server: \`$SERVER_NAME\`" + + TAGS="checkered_flag" + PRIORITY="default" +else + TITLE="QNAP Shutdown fehlgeschlagen" + MESSAGE="Das QNAP konnte nicht heruntergefahren werden. + +Server: \`$SERVER_NAME\` + +SSH Fehler: \`$ssh_error\`" + + TAGS="warning" + PRIORITY="high" +fi + +# JSON Payload sicher erzeugen +JSON_PAYLOAD=$(jq -n \ + --arg topic "Duplicati" \ + --arg title "$TITLE" \ + --arg message "$MESSAGE" \ + --arg url "$DUPLICATI_URL" \ + '{ + topic: $topic, + title: $title, + message: $message, + click: "", + actions: [ + { + action: "view", + label: "Duplicati öffnen", + url: $url + } + ] + }' +) + +# Debug optional +echo "$JSON_PAYLOAD" + +# NTFY senden +curl -s -X POST "$NTFY_URL" \ + -H "Authorization: Bearer $AUTH_TOKEN" \ + -H "Priority: $PRIORITY" \ + -H "Tags: $TAGS" \ + ${ICON:+-H "Icon: $ICON"} \ + -H "Markdown: yes" \ + -H "Content-Type: application/json" \ + -d "$JSON_PAYLOAD" +# Passender Exitcode +if [[ "$shutdown_success" == true ]]; then + exit 0 +else + exit 1 +fi \ No newline at end of file