Initial commit
This commit is contained in:
commit
80a5394548
4 files changed
+251
No files matched your search
@@ -0,0 +1 @@
|
||||
shell_ntfy_remote_shutdown.env.own
|
||||
@@ -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
|
||||
```
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in new issue
Block a user