2025-07-30-2
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,5 +1,5 @@
|
|||||||
# Log-Verzeichnis und Dateien (Logdateien nie committen)
|
# Log-Verzeichnis und Dateien (Logdateien nie committen)
|
||||||
log/
|
log/ssh-cert-login.log
|
||||||
|
|
||||||
# Temporäre SSH Keys
|
# Temporäre SSH Keys
|
||||||
temp_keys/
|
temp_keys/
|
||||||
|
|||||||
147
README.md
Normal file
147
README.md
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
# SSH-Zertifikats-Login mit zentraler CA
|
||||||
|
|
||||||
|
Dieses Projekt ermöglicht eine einfache und sichere Anmeldung per SSH auf mehreren Servern über kurzzeitige, von einer zentralen Zertifizierungsstelle (CA) signierte SSH-Zertifikate.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Zentrale SSH CA zur Signierung temporärer SSH-Schlüssel
|
||||||
|
- Automatisches Erzeugen und Signieren von SSH-Keys
|
||||||
|
- Interaktive Auswahl der Ziel-VM, des Benutzers und der Zertifikatsgültigkeit über `gum`
|
||||||
|
- Logging aller wichtigen Aktionen (Konsole + Logdatei)
|
||||||
|
- Schutz der privaten CA-Schlüssel durch zentrale Signatur-VM
|
||||||
|
- Flexible Erweiterbarkeit
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verzeichnisstruktur
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── log/ # Logs und Logging-Script
|
||||||
|
│ ├── logging.sh
|
||||||
|
│ └── ssh-cert-login.log
|
||||||
|
├── temp_keys/ # Temporäre SSH-Schlüssel werden hier erzeugt
|
||||||
|
├── login.sh # Hauptscript für Zertifikatserstellung und SSH-Login
|
||||||
|
├── remote_sign.sh # Remote-Skript auf der CA-VM zur Signatur
|
||||||
|
├── .gitignore # Git Ignore für Logs, temporäre Keys, etc.
|
||||||
|
└── README.md # Diese Datei
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Voraussetzungen
|
||||||
|
|
||||||
|
- Bash unter Linux/macOS
|
||||||
|
- `ssh` und `ssh-keygen`
|
||||||
|
- `scp` für Dateiübertragungen
|
||||||
|
- `gum` (https://github.com/charmbracelet/gum) für das interaktive Terminal-Menü
|
||||||
|
- Zugriff auf eine CA-VM mit privatem CA-Key und dem `remote_sign.sh` Script
|
||||||
|
- SSH-Key für Anmeldung an der CA-VM (`id_ca` o.ä.)
|
||||||
|
|
||||||
|
### Hinweis zur CA-Authentifizierung
|
||||||
|
|
||||||
|
Das Skript prüft automatisch, ob der SSH-Private-Key `id_ca` (Standardpfad: `~/.ssh/id_ca`) vorhanden ist.
|
||||||
|
Dieser Schlüssel wird zur Authentifizierung auf der CA-VM benötigt, um die Signaturanfrage abzusenden.
|
||||||
|
|
||||||
|
Falls die Datei nicht vorhanden ist, bricht das Skript mit einer Fehlermeldung ab.
|
||||||
|
|
||||||
|
👉 **Lösung:** Stelle sicher, dass sich dein Private Key `id_ca` im richtigen Verzeichnis befindet und per `chmod 600 ~/.ssh/id_ca` korrekt geschützt ist. Optional kannst du den Pfad im Skript `login.sh` anpassen, falls du einen anderen Schlüssel verwenden möchtest.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. `gum` installieren (z.B. via `brew install gum` oder Snap/Paketmanager)
|
||||||
|
|
||||||
|
2. Alle Skripte und Verzeichnisse in ein Git-Repository klonen oder kopieren
|
||||||
|
|
||||||
|
3. CA-VM korrekt konfigurieren (privater CA-Key, `remote_sign.sh`)
|
||||||
|
|
||||||
|
4. `login.sh` ausführbar machen:
|
||||||
|
```bash
|
||||||
|
chmod +x login.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Log-Verzeichnis anlegen (falls nicht vorhanden):
|
||||||
|
```bash
|
||||||
|
mkdir -p log
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Im Log-Verzeichnis die Datei rotate.cfg anlegen, meist mit diesen Parametern:
|
||||||
|
```bash
|
||||||
|
/var/log/my_app/*.log {
|
||||||
|
daily
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
missingok
|
||||||
|
notifempty
|
||||||
|
dateext
|
||||||
|
}
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## Nutzung
|
||||||
|
|
||||||
|
Starte das Login-Skript:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./login.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
- Wähle die Ziel-VM aus der Liste
|
||||||
|
- Wähle den SSH-Benutzer (vordefiniert oder eigene Eingabe)
|
||||||
|
- Wähle die Gültigkeitsdauer des Zertifikats
|
||||||
|
- Das Skript generiert einen temporären SSH-Key, sendet den Public Key zur CA, holt das signierte Zertifikat zurück und startet die SSH-Verbindung zum Ziel
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sicherheitshinweise
|
||||||
|
|
||||||
|
- Der private CA-Schlüssel sollte ausschließlich auf der CA-VM gespeichert und geschützt werden
|
||||||
|
- Temporäre SSH-Keys sind nur kurz gültig (Standard 5 Minuten)
|
||||||
|
- Logdateien enthalten keine privaten Schlüssel, aber Pfadangaben und Benutzerinformationen – vor unberechtigtem Zugriff schützen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lizenz
|
||||||
|
|
||||||
|
MIT License (oder nach Wunsch anpassen)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kontakt
|
||||||
|
|
||||||
|
Bei Fragen oder Problemen gerne melden!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Viel Erfolg mit deinem zentralen SSH-Zertifikats-Login!**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Gum installieren (falls nicht vorhanden)
|
||||||
|
|
||||||
|
Falls `gum` noch nicht installiert ist, kannst du es direkt von GitHub beziehen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Neueste Version ermitteln
|
||||||
|
GUM_VERSION=$(curl -s https://api.github.com/repos/charmbracelet/gum/releases/latest | grep tag_name | cut -d '"' -f 4)
|
||||||
|
|
||||||
|
# Download für Linux x86_64
|
||||||
|
curl -L "https://github.com/charmbracelet/gum/releases/download/${GUM_VERSION}/gum_${GUM_VERSION#v}_Linux_x86_64.tar.gz" -o gum.tar.gz
|
||||||
|
|
||||||
|
# Entpacken
|
||||||
|
tar -xzf gum.tar.gz
|
||||||
|
|
||||||
|
# Nach /usr/local/bin verschieben
|
||||||
|
sudo install gum /usr/local/bin
|
||||||
|
|
||||||
|
# Testen
|
||||||
|
gum --version
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternativ findest du alle Releases unter:
|
||||||
|
👉 https://github.com/charmbracelet/gum/releases
|
||||||
38
id_ca
38
id_ca
@ -1,38 +0,0 @@
|
|||||||
-----BEGIN OPENSSH PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
-----END OPENSSH PRIVATE KEY-----
|
|
||||||
@ -1 +0,0 @@
|
|||||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2VrWLyOnW5eHKAASFtxvHEnvL1unTHHsvb4ndNAxmhU+4gOMddRvghFymcQS4VmqIErCOKHg36AjzPp3oBw9AL1HPw7nf+SUbZQi9iKhbs1+lC0fNqRQm9CY4t+tjAC8AwxN4os1yvVwmyXqaFTaArRAk1BCOP2gQBr7OmO0ECVTtXXKjyAxnvp/4GouU9KTjs+tDAYbcQz5H6yXlwhDjqO65X1HBC61wDo8FTqeIWI215j0pfgE5YNURJgOkmjcs34IxrgyRt32fKaXZNXRbDOc1OAwAm3Sk7yGiuwTohp5HsnYp8yQjTz50OlyZuyT1g3y5Dkz5ISKsZeQ2Uag9DLjhXxAUF8G2oFOs0z9IU9LKrv89A9xDUFsoMtI6dnUAOHWBhyUDxSgYWT87bmsUoHZ17zyp2I6QzG6olGH5bUoq/ApuxfnTvIie/ZeVoC0jPvys4MOPMANNJNNrSkO++2vy6eOhcEvSWaFkg8oHabOr4cCblueIFhV+sp6ObDM= oberkoetter@PC7-77
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
DEFAULT_LOG_FILE="./log/log.txt"
|
DEFAULT_LOG_FILE="./log-default.txt"
|
||||||
ACTIVE_LOG_FILE="/home/oberkoetter/Dokumente/Git/log.txt"
|
ACTIVE_LOG_FILE="./log.txt"
|
||||||
|
|
||||||
log_init() {
|
log_init() {
|
||||||
ACTIVE_LOG_FILE="${1:-$DEFAULT_LOG_FILE}"
|
ACTIVE_LOG_FILE="${1:-$DEFAULT_LOG_FILE}"
|
||||||
|
|||||||
126
login.sh
Normal file → Executable file
126
login.sh
Normal file → Executable file
@ -7,101 +7,105 @@ YELLOW='\033[1;33m'
|
|||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
NC='\033[0m' # No Color
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
# Pfad zum Script-Verzeichnis
|
# CA-Auth Schlüssel
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
CA_KEY_PATH="$HOME/.ssh/id_ca"
|
||||||
|
|
||||||
# Logging-Script einbinden
|
# Config
|
||||||
source "$SCRIPT_DIR/log/logging.sh"
|
|
||||||
|
|
||||||
# Logdatei im log/-Verzeichnis
|
|
||||||
LOG_FILE="$SCRIPT_DIR/log/ssh-cert-login.log"
|
|
||||||
|
|
||||||
log_init "$LOG_FILE"
|
|
||||||
log_start "SSH Zertifikat Login"
|
|
||||||
|
|
||||||
# Config CA und Ziel (Standardwerte)
|
|
||||||
CA_HOST="100.87.87.5"
|
CA_HOST="100.87.87.5"
|
||||||
CA_USER="alf"
|
CA_USER="alf"
|
||||||
CA_PORT=22
|
CA_PORT=22
|
||||||
REMOTE_SIGN_SCRIPT="/home/alf/remote_sign.sh"
|
REMOTE_SIGN_SCRIPT="/home/alf/remote_sign.sh" # Pfad auf der CA-VM, wo das Script zum Signieren zu finden ist
|
||||||
KEY_DIR="$SCRIPT_DIR/temp_keys"
|
KEY_DIR="./temp_keys"
|
||||||
KEY_NAME="temp_user_key"
|
KEY_NAME="temp_user_key"
|
||||||
CA_SSH_KEY="$HOME/.ssh/id_ca"
|
LOG_DIR="$HOME/Gitea/ssh-cert-login/log"
|
||||||
|
LOG_SCRIPT="${LOG_DIR}/logging.sh"
|
||||||
|
LOG_FILE="${LOG_DIR}/ssh-cert-login.log"
|
||||||
|
|
||||||
# Gum Check
|
|
||||||
if ! command -v gum &> /dev/null; then
|
# Logging initialisieren
|
||||||
log_error "gum ist nicht installiert. Bitte zuerst installieren."
|
source "$LOG_SCRIPT"
|
||||||
|
log_init "$LOG_FILE"
|
||||||
|
log_start "SSH-Login über CA-Zertifikat"
|
||||||
|
|
||||||
|
# Prüfen, ob der CA-Schlüssel vorhanden ist
|
||||||
|
if [[ ! -f "$CA_KEY_PATH" ]]; then
|
||||||
|
echo -e "${RED}[!] CA-SSH-Schlüssel ($CA_KEY_PATH) nicht gefunden. Vorgang wird abgebrochen.${NC}"
|
||||||
|
echo "Bitte stelle sicher, dass ~/.ssh/id_ca vorhanden und korrekt gesetzt ist."
|
||||||
|
log_error "Kein Publickey zur CA-VM!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# VM Alias → IP Map
|
# Gum Check
|
||||||
declare -A VM_MAP=(
|
if ! command -v gum &> /dev/null; then
|
||||||
[Server1]="100.87.87.101"
|
echo -e "${RED}[!] gum ist nicht installiert. Bitte zuerst installieren.${NC}"
|
||||||
[ABS]="100.87.87.102"
|
log_error "GUM nicht installiert!"
|
||||||
[OMVPi]="100.87.87.80"
|
exit 1
|
||||||
[OMV2000]="100.87.87.81"
|
|
||||||
[CA]="100.87.87.5"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Auswahl der VM per Alias mit gum choose
|
|
||||||
VM_ALIAS=$(gum choose --header "Wähle die Ziel-VM" "${!VM_MAP[@]}")
|
|
||||||
TARGET_HOST="${VM_MAP[$VM_ALIAS]}"
|
|
||||||
|
|
||||||
# Benutzer-Auswahl mit festen Optionen + freie Eingabe
|
|
||||||
USER_OPTIONS=("alf" "root" "oberkoetter" "Anderer Benutzer")
|
|
||||||
SELECTED_USER=$(gum choose --header "Wähle den SSH-Benutzer" "${USER_OPTIONS[@]}")
|
|
||||||
|
|
||||||
if [ "$SELECTED_USER" == "Anderer Benutzer" ]; then
|
|
||||||
SSH_USER=$(gum input --placeholder "Benutzername eingeben")
|
|
||||||
else
|
|
||||||
SSH_USER="$SELECTED_USER"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Ziel-Host-Auswahl
|
||||||
|
declare -A HOSTS=(
|
||||||
|
["Server1"]="100.87.87.101"
|
||||||
|
["ABS"]="100.87.87.102"
|
||||||
|
["OMVPi"]="100.87.87.80"
|
||||||
|
["OMV2000"]="100.87.87.81"
|
||||||
|
["CA"]="100.87.87.5"
|
||||||
|
["PHOSCON"]="100.87.87.90"
|
||||||
|
["DIETPI"]="100.87.87.4"
|
||||||
|
["PROXI"]="100.87.87.100"
|
||||||
|
["MATE3"]="100.87.87.108"
|
||||||
|
["PC77"]="100.87.87.77"
|
||||||
|
)
|
||||||
|
|
||||||
|
TARGET_LABEL=$(gum choose --header "Zielsystem wählen" "${!HOSTS[@]}")
|
||||||
|
TARGET_HOST="${HOSTS[$TARGET_LABEL]}"
|
||||||
|
log_info "Zielsystem gewählt: $TARGET_LABEL ($TARGET_HOST)"
|
||||||
|
|
||||||
TARGET_PORT=$(gum input --placeholder "Ziel SSH Port" --value "2222")
|
TARGET_PORT=$(gum input --placeholder "Ziel SSH Port" --value "2222")
|
||||||
|
log_info "SSH-Port: $TARGET_PORT"
|
||||||
|
|
||||||
VALIDITY_OPTIONS=("300" "600" "1800" "3600") # Sek. 5min, 10min, 30min, 1h
|
# Benutzer-Auswahl
|
||||||
VALIDITY=$(gum choose --header "Gültigkeitsdauer des Zertifikats wählen" "${VALIDITY_OPTIONS[@]}")
|
USER_CHOICES=("alf" "root" "oberkoetter" "Benutzer manuell eingeben")
|
||||||
|
SSH_USER=$(gum choose --header "SSH-Benutzer wählen" "${USER_CHOICES[@]}")
|
||||||
|
if [[ "$SSH_USER" == "Benutzer manuell eingeben" ]]; then
|
||||||
|
SSH_USER=$(gum input --placeholder "SSH Benutzername")
|
||||||
|
fi
|
||||||
|
log_info "Verwendeter Benutzer: $SSH_USER"
|
||||||
|
|
||||||
# Logge die Ziel-VM und den SSH-Benutzer
|
# Gültigkeit wählen
|
||||||
log_info "Ziel-VM: $VM_ALIAS ($TARGET_HOST)"
|
VALIDITY_OPTIONS=("300" "600" "1800" "3600") # Sekunden
|
||||||
log_info "SSH-Benutzer: $SSH_USER"
|
VALIDITY=$(gum choose --header "Gültigkeitsdauer des Zertifikats wählen (Sekunden)" "${VALIDITY_OPTIONS[@]}")
|
||||||
|
log_info "Zertifikatsgültigkeit: $VALIDITY Sekunden"
|
||||||
|
|
||||||
# Keys vorbereiten
|
# Schlüssel vorbereiten
|
||||||
mkdir -p "$KEY_DIR"
|
mkdir -p "$KEY_DIR"
|
||||||
cd "$KEY_DIR"
|
cd "$KEY_DIR"
|
||||||
|
|
||||||
log_info "Prüfe auf vorhandene temporäre Schlüssel..."
|
log_info "Prüfe auf vorhandene temporäre Schlüssel"
|
||||||
if [[ -f "$KEY_NAME" || -f "${KEY_NAME}.pub" || -f "${KEY_NAME}-cert.pub" ]]; then
|
rm -f "$KEY_NAME" "$KEY_NAME.pub" "$KEY_NAME-cert.pub"
|
||||||
log_warn "Vorherige temporäre Schlüssel werden gelöscht..."
|
|
||||||
rm -f "$KEY_NAME" "$KEY_NAME.pub" "$KEY_NAME-cert.pub"
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_info "Generiere temporären SSH-Key..."
|
log_info "Generiere temporären SSH-Key"
|
||||||
ssh-keygen -f "$KEY_NAME" -N "" -C "$SSH_USER@temp" > /dev/null
|
ssh-keygen -f "$KEY_NAME" -N "" -C "$SSH_USER@temp" > /dev/null
|
||||||
|
|
||||||
log_info "Sende Public Key zur CA (${CA_HOST})..."
|
log_info "Sende Public Key zur CA (${CA_HOST})"
|
||||||
scp -i "$CA_SSH_KEY" -P "$CA_PORT" "${KEY_NAME}.pub" "${CA_USER}@${CA_HOST}:/tmp/" || {
|
scp -P "$CA_PORT" -i "$CA_KEY_PATH" "${KEY_NAME}.pub" "${CA_USER}@${CA_HOST}:/tmp/" || {
|
||||||
log_error "Fehler beim Senden des Public Keys zur CA"
|
log_error "Fehler beim Senden des Public Keys zur CA"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info "Fordere Signatur von CA an..."
|
log_info "Fordere Signatur von CA an..."
|
||||||
ssh -i "$CA_SSH_KEY" -p "$CA_PORT" "${CA_USER}@${CA_HOST}" \
|
ssh -i "$CA_KEY_PATH" -p "$CA_PORT" "${CA_USER}@${CA_HOST}" "$REMOTE_SIGN_SCRIPT /tmp/${KEY_NAME}.pub $SSH_USER $VALIDITY" || {
|
||||||
"$REMOTE_SIGN_SCRIPT /tmp/${KEY_NAME}.pub $SSH_USER $VALIDITY" || {
|
|
||||||
log_error "Fehler bei der Signierung durch die CA"
|
log_error "Fehler bei der Signierung durch die CA"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info "Lade signiertes Zertifikat von CA..."
|
log_info "Lade signiertes Zertifikat von CA"
|
||||||
scp -i "$CA_SSH_KEY" -P "$CA_PORT" "${CA_USER}@${CA_HOST}:/tmp/${KEY_NAME}-cert.pub" . || {
|
scp -P "$CA_PORT" -i "$CA_KEY_PATH" "${CA_USER}@${CA_HOST}:/tmp/${KEY_NAME}-cert.pub" . || {
|
||||||
log_error "Fehler beim Abrufen des Zertifikats von der CA"
|
log_error "Fehler beim Abrufen des Zertifikats von der CA"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info "Zertifikat erfolgreich erhalten"
|
log_info "Zertifikat erfolgreich erhalten – starte SSH-Verbindung"
|
||||||
log_info "Starte SSH-Verbindung zum Zielsystem (${VM_ALIAS} / ${TARGET_HOST}) über Port ${TARGET_PORT}..."
|
|
||||||
|
|
||||||
ssh -p "$TARGET_PORT" -i "$KEY_NAME" "$SSH_USER@$TARGET_HOST"
|
ssh -p "$TARGET_PORT" -i "$KEY_NAME" "$SSH_USER@$TARGET_HOST"
|
||||||
|
|
||||||
log_end "SSH Zertifikat Login"
|
log_end "SSH-Login abgeschlossen"
|
||||||
|
|
||||||
|
|||||||
158
rclonecloner.sh
Normal file
158
rclonecloner.sh
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
########## 0 Einstellungen und Funktionen ###############
|
||||||
|
jjahr=$(date +%Y)
|
||||||
|
AArchiv=$(date +%Y-%m-%d-%H-%M)
|
||||||
|
testlauf="ja" # bei "ja" wird übersprungen: Hörbücher A-Z, Bilder Alf und Louisa
|
||||||
|
logbuch="root/log.txt"
|
||||||
|
|
||||||
|
source /root/logger.sh
|
||||||
|
|
||||||
|
function eingehaengt () {
|
||||||
|
DECRYPTED_DIR="/srv/dev-disk-by-uuid-cdd3de56-0b4f-48cf-aec0-abf441a759b5/"
|
||||||
|
|
||||||
|
if mountpoint -q "$DECRYPTED_DIR"; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
################## Hauptschleife #####################
|
||||||
|
|
||||||
|
neu_log
|
||||||
|
info_log "RCLCLO Archiv-Ordner gesetzt auf: $AArchiv"
|
||||||
|
info_log "RCLCLO Starte grosses Cloning..."
|
||||||
|
|
||||||
|
if [ $testlauf = "ja" ]
|
||||||
|
then
|
||||||
|
err_log "RCLCLO TESTLAUF!"
|
||||||
|
else
|
||||||
|
err_log "RCLCLO Kein Testlauf."
|
||||||
|
fi
|
||||||
|
|
||||||
|
info_log "RCLCLO Teste Laufwerk..."
|
||||||
|
|
||||||
|
eingehaengt
|
||||||
|
if [ $? -eq 0 ] # Prüfe auf 0 für Erfolg, nicht auf 1
|
||||||
|
then
|
||||||
|
info_log "RCLCLO Laufwerk OK!"
|
||||||
|
else
|
||||||
|
err_log "RCLCLO Laufwerk nicht freigegeben."
|
||||||
|
err_log "RCLCLO EXIT!"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
######## 1 OMV-Config sichern... #########
|
||||||
|
info_log "OMV-Config sichern"
|
||||||
|
if [ $testlauf = "nein" ]
|
||||||
|
then
|
||||||
|
rclone sync /etc/openmediavault/config.xml jottasecret:/BackupHomelab/OMV80/ --log-file=$logbuch --backup-dir=jottasecret:/BackupHomelab/Archiv/OMV80/$AArchiv/ -P
|
||||||
|
else
|
||||||
|
info_log "OMV-Config-Sicherung übersprungen"
|
||||||
|
fi
|
||||||
|
|
||||||
|
######## 2 Phonostar-Cloning ############
|
||||||
|
info_log "RCLCLO Starte PhonoStar-Download"
|
||||||
|
if [ $testlauf = "nein" ]
|
||||||
|
then
|
||||||
|
rclone move magentawralto:/phonostar_radio_cloud/ /srv/MEDIEN/Audio/Radio-Archiv/Phonostar/ --create-empty-src-dirs --log-file=$logbuch -P
|
||||||
|
mmonat=$(date +%m-%Y)
|
||||||
|
# find /srv/MEDIEN/Audio/Radio-Archiv/Phonostar -iname "*$mmonat*" -exec mv {} /srv/MEDIEN/Audio/Radio-Archiv/2025/$(date +%m)/ -v \; >>/root/log.txt
|
||||||
|
err_log "RCLCLO Phonostar Downlod ERR: $?"
|
||||||
|
else
|
||||||
|
info_log "Phonostar-Download übersprungen"
|
||||||
|
fi
|
||||||
|
|
||||||
|
######### 3 Radio-Cloning ################
|
||||||
|
info_log 'RCLCLO Starte Radio-Cloning...'
|
||||||
|
info_log "Jahr: $jjahr"
|
||||||
|
if [ $testlauf = "nein" ]
|
||||||
|
then
|
||||||
|
rclone sync -P /srv/MEDIEN/Audio/Radio-Archiv/$jjahr jotta:/Audio/Radio/$jjahr/ --exclude=gPodder/ --log-file=$logbuch --backup-dir=jotta:/Archiv/Audio/$AArchiv/Radio/$jjahr/
|
||||||
|
err_log "RCLCLO ERR: $?"
|
||||||
|
else
|
||||||
|
info_log "RCLCLO Radio-Cloning übersprungen (Testlauf)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
########### 4 Hörbücher #############
|
||||||
|
info_log 'RCLCLO Hörbücher...'
|
||||||
|
if [ $testlauf = "ja" ]
|
||||||
|
then
|
||||||
|
buchverz="A"
|
||||||
|
info_log "RCLCLO Radio-Cloning Hörbücher-Verzeichnisse: $buchverz (Testlauf)"
|
||||||
|
else
|
||||||
|
buchverz="A B C D E F G H I J K L M N O P Q R S SCH T"
|
||||||
|
info_log "RCLCLO Radio-Cloning Hörbücher-Verzeichnisse: $buchverz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for bbuch in $buchverz; do
|
||||||
|
info_log "RCLCLO Buchstabe: $bbuch"
|
||||||
|
rclone sync -P /srv/MEDIEN/Audio/Hörbücher/A-Z/$bbuch/ jotta:/Audio/Hörbücher/A-Z/$bbuch/ --log-file=$logbuch --backup-dir=jotta:/Archiv/Audio/$AArchiv/Hörbücher/$bbuch/
|
||||||
|
err_log "RCLCLO ERR: $?"
|
||||||
|
echo " "
|
||||||
|
done
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
|
||||||
|
######### 5 Musik ##############
|
||||||
|
|
||||||
|
if [ $testlauf = "nein" ]
|
||||||
|
then
|
||||||
|
info_log "RCLCLO Musik"
|
||||||
|
rclone sync -P /srv/MEDIEN/Audio/Musik/ jottasecret:/Audio/Musik/ --log-file=$logbuch --backup-dir jottasecret:/Archiv/Audio/$AArchiv/Musik/
|
||||||
|
else
|
||||||
|
info_log "RCLCLO Musik-Cloning übersprungen (Testlauf)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " "
|
||||||
|
echo " "
|
||||||
|
|
||||||
|
|
||||||
|
############ 6 Bilder ###############
|
||||||
|
|
||||||
|
if [ $testlauf = "ja" ]
|
||||||
|
then
|
||||||
|
info_log "RCLCLO Testlauf: Bilder Alf übersprungen"
|
||||||
|
else
|
||||||
|
info_log "RCLCLO Alfs Bilder... Jahrgang: $jjahr"
|
||||||
|
rclone sync -P /srv/MEDIEN/Bilder/Alf/$jjahr/ jottasecret:/Bilder/Alf/$jjahr/ --log-file=$logbuch --backup-dir jottasecret:/Archiv/Bilder/$AArchiv/Alf/$jjahr/ --ignore-existing
|
||||||
|
err_log "RCLCLO ERR: $?"
|
||||||
|
echo " "
|
||||||
|
echo " "
|
||||||
|
/bin/bash /root/louisabackup.sh
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
info_log 'RCLCLO Fertig!'
|
||||||
|
|
||||||
|
############### 7 OMV-Sync 2000 #######################
|
||||||
|
|
||||||
|
info_log "R2000 OMV-Sychronisierung..."
|
||||||
|
info_log "R2000 Disk auf OMV2000 eingehängt?"
|
||||||
|
|
||||||
|
# SSH-Verbindungsinformationen
|
||||||
|
SSH_USER="root" # Dein Benutzername auf dem Remote-Server
|
||||||
|
SSH_HOST="100.87.87.81" # Die IP-Adresse oder der Hostname des Remote-Servers
|
||||||
|
|
||||||
|
# Das Verzeichnis auf dem Remote-Server, das der Entschlüsselungs-Mount-Point ist
|
||||||
|
REMOTE_DECRYPTED_DIR="/srv/dev-disk-by-uuid-13cadd43-4179-427d-a0bd-3bc17596b05f" # z.B. /mnt/mydata_decrypted
|
||||||
|
info_log "R2000 Prüfe, ob '$REMOTE_DECRYPTED_DIR' auf $SSH_HOST entschlüsselt ist..."
|
||||||
|
|
||||||
|
# Führe 'mountpoint -q' auf dem Remote-Server aus
|
||||||
|
ssh -p2222 -i /root/Schluessel/id_rclone "$SSH_USER@$SSH_HOST" "mountpoint -q \"$REMOTE_DECRYPTED_DIR\""
|
||||||
|
|
||||||
|
# Überprüfe den Exit-Status des Remote-Befehls
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
info_log "R2000 Erfolg: Das Verzeichnis '$REMOTE_DECRYPTED_DIR' auf $SSH_HOST ist entschlüsselt (gemountet)."
|
||||||
|
else
|
||||||
|
err_log "R2000 Fehler: Das Verzeichnis '$REMOTE_DECRYPTED_DIR' auf $SSH_HOST ist NICHT entschlüsselt (nicht gemountet)."
|
||||||
|
err_log "R2000 Bitte entschlüsseln Sie es auf dem Server."
|
||||||
|
exit 1 # Das Skript mit einem Fehlercode beenden
|
||||||
|
fi
|
||||||
|
|
||||||
|
# rsync -r -u -P --delete -e "ssh -p2222 -i /root/id_OMV81" /srv/dev-disk-by-uuid-cdd3de56-0b4f-48cf-aec0-abf441a759b5/ root@100.87.87.81:/srv/dev-disk-by-uuid-13cadd43-4179-427d-a0bd-3bc17596b05f/ --exclude=.Trash-1000/
|
||||||
|
|
||||||
|
rsync -r -u -P -e "ssh -p2222 -i /root/Schluessel/id_rclone" /srv/dev-disk-by-uuid-cdd3de56-0b4f-48cf-aec0-abf441a759b5/ root@100.87.87.81:/srv/dev-disk-by-uuid-13cadd43-4179-427d-a0bd-3bc17596b05f/ --exclude=.Trash-1000/ --log-file=$logfile
|
||||||
|
|
||||||
Reference in New Issue
Block a user