Compare commits

..

21 Commits

Author SHA1 Message Date
alf
a6920c5a27 README.md aktualisiert 2026-03-03 19:48:07 +00:00
alf
252da4cc76 login.sh aktualisiert 2025-11-23 12:47:49 +00:00
alf
9c3fb71f98 login.sh aktualisiert 2025-11-23 12:43:37 +00:00
alf
15cf1dd22b login.sh aktualisiert 2025-11-23 12:42:09 +00:00
alf
fd2989d438 login.sh aktualisiert 2025-11-23 12:12:29 +00:00
alf
f5bc23801b login.sh aktualisiert
Unterscheidung zwischen Servern, die nur mittel PublicKey und solchen, die mit zertifizierten PublicKeys verbunden werden. Die Unterscheidung findet in Zeile 83 statt. Server, die hier eingetragen sind, werden nur mit dem PublicKey, dessen Pfad in Zeile 27 ("SIMPLE_KEY") angegeben ist, verbunden.
2025-11-17 15:15:32 +00:00
alf
ad8862a479 README.md aktualisiert 2025-10-16 20:20:07 +00:00
alf
805902ca3d login.sh aktualisiert 2025-09-12 06:21:47 +00:00
alf
2006178a48 log/logging.sh gelöscht 2025-09-04 11:48:08 +00:00
alf
64b809c7e5 .gitignore aktualisiert 2025-09-04 11:47:25 +00:00
alf
bd60a23f92 rclonecloner.sh gelöscht 2025-09-04 11:47:02 +00:00
alf
0da8269097 login.sh aktualisiert 2025-09-04 11:38:21 +00:00
alf
a09e7bc912 Merge pull request 'login.sh aktualisiert' (#1) from port222aufca into main
Reviewed-on: #1
2025-09-04 11:37:35 +00:00
alf
783f26102d login.sh aktualisiert 2025-09-04 10:56:28 +00:00
alf
5efa222aec login.sh aktualisiert
Logging korritigiert
2025-09-04 10:38:12 +00:00
alf
209648e346 login.sh aktualisiert 2025-09-04 09:55:50 +00:00
alf
2f9b5d43a2 login.sh aktualisiert
Server3 hinzugefügt.
2025-09-04 09:52:38 +00:00
alf
9365f7622a README.md aktualisiert 2025-08-29 07:39:00 +00:00
alf
b4eb2a54d2 login.sh aktualisiert
Logger berichtigt
2025-08-15 16:38:51 +00:00
Alf
3102a9fc76 2025-07-30-2 2025-07-30 11:03:05 +02:00
Alf
2b2a0434ab 2025-07-30 2025-07-30 11:00:23 +02:00
5 changed files with 85 additions and 244 deletions

3
.gitignore vendored
View File

@ -1,5 +1,6 @@
# Log-Verzeichnis und Dateien (Logdateien nie committen) # Log-Verzeichnis und Dateien (Logdateien nie committen)
log/ssh-cert-login.log log/
*.log
# Temporäre SSH Keys # Temporäre SSH Keys
temp_keys/ temp_keys/

View File

@ -42,8 +42,8 @@ Dieses Projekt ermöglicht eine einfache und sichere Anmeldung per SSH auf mehre
### Hinweis zur CA-Authentifizierung ### Hinweis zur CA-Authentifizierung
Das Skript prüft automatisch, ob der SSH-Private-Key `id_ca` (Standardpfad: `~/.ssh/id_ca`) vorhanden ist. Das Skript prüft automatisch, ob der SSH-Private-Key `ca_key.pub` (Standardpfad: `~/.ssh/ca_key.pub`) vorhanden ist.
Dieser Schlüssel wird zur Authentifizierung auf der CA-VM benötigt, um die Signaturanfrage abzusenden. Dieser Schlüssel wird zur Authentifizierung auf der CA-VM benötigt, um die Signaturanfrage abzusenden. Muss lokal per ssh-keygen erstellt und mit ssh-copy-id auf die CA übertragen werden.
Falls die Datei nicht vorhanden ist, bricht das Skript mit einer Fehlermeldung ab. Falls die Datei nicht vorhanden ist, bricht das Skript mit einer Fehlermeldung ab.
@ -53,7 +53,13 @@ Falls die Datei nicht vorhanden ist, bricht das Skript mit einer Fehlermeldung a
## Installation ## Installation
1. `gum` installieren (z.B. via `brew install gum` oder Snap/Paketmanager) 1. `gum` installieren:
```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update && sudo apt install gum
```
2. Alle Skripte und Verzeichnisse in ein Git-Repository klonen oder kopieren 2. Alle Skripte und Verzeichnisse in ein Git-Repository klonen oder kopieren

View File

@ -1,32 +0,0 @@
#!/bin/bash
DEFAULT_LOG_FILE="./log-default.txt"
ACTIVE_LOG_FILE="./log.txt"
log_init() {
ACTIVE_LOG_FILE="${1:-$DEFAULT_LOG_FILE}"
mkdir -p "$(dirname "${ACTIVE_LOG_FILE}")"
}
_log_dual() {
local level="$1"
local message="$2"
local timestamp
timestamp="$(date '+%Y-%m-%d %H:%M:%S')"
local line="${timestamp} [${level}] ${message}"
echo "$line" # Konsole
echo "$line" >> "${ACTIVE_LOG_FILE}" # Logdatei
}
log_info() { _log_dual "INFO" "$1"; }
log_warn() { _log_dual "WARN" "$1"; }
log_error() { _log_dual "ERROR" "$1"; }
log_start() {
echo "" | tee -a "${ACTIVE_LOG_FILE}"
_log_dual "START" "--- $1 gestartet ---"
}
log_end() {
_log_dual "END" "--- $1 abgeschlossen ---"
echo "" | tee -a "${ACTIVE_LOG_FILE}"
}

122
login.sh
View File

@ -1,5 +1,12 @@
#!/bin/bash #!/bin/bash
set -e set -e
GIT_PFAD="$HOME/Gitea"
source $GIT_PFAD/logger/logger.sh
LOGBUCH="$GIT_PFAD/logger/Logs/ssh-login.log"
log_init "$LOGBUCH"
log_start
log_info "Starte sshlogin…"
# Farben # Farben
GREEN='\033[0;32m' GREEN='\033[0;32m'
@ -13,19 +20,11 @@ CA_KEY_PATH="$HOME/.ssh/id_ca"
# Config # Config
CA_HOST="100.87.87.5" CA_HOST="100.87.87.5"
CA_USER="alf" CA_USER="alf"
CA_PORT=22 CA_PORT=2222
REMOTE_SIGN_SCRIPT="/home/alf/remote_sign.sh" # Pfad auf der CA-VM, wo das Script zum Signieren zu finden ist REMOTE_SIGN_SCRIPT="/home/alf/remote_sign.sh" # Pfad auf der CA-VM, wo das Script zum Signieren zu finden ist
KEY_DIR="./temp_keys" KEY_DIR="./temp_keys"
KEY_NAME="temp_user_key" KEY_NAME="temp_user_key"
LOG_DIR="$HOME/Gitea/ssh-cert-login/log" SIMPLE_KEY="/media/oberkoetter/schluessel1/id_oberkoetter" # Für das einfache Login ohne Zertifikat, aber mit PublicKey. Die Variable gibt die Lage des PubKeys an.
LOG_SCRIPT="${LOG_DIR}/logging.sh"
LOG_FILE="${LOG_DIR}/ssh-cert-login.log"
# Logging initialisieren
source "$LOG_SCRIPT"
log_init "$LOG_FILE"
log_start "SSH-Login über CA-Zertifikat"
# Prüfen, ob der CA-Schlüssel vorhanden ist # Prüfen, ob der CA-Schlüssel vorhanden ist
if [[ ! -f "$CA_KEY_PATH" ]]; then if [[ ! -f "$CA_KEY_PATH" ]]; then
@ -42,9 +41,11 @@ if ! command -v gum &> /dev/null; then
exit 1 exit 1
fi fi
# Ziel-Host-Auswahl # Ziel-Host-Auswahl
declare -A HOSTS=( declare -A HOSTS=(
["Server1"]="100.87.87.101" ["Server1"]="100.87.87.101"
["Server3"]="100.87.87.103"
["ABS"]="100.87.87.102" ["ABS"]="100.87.87.102"
["OMVPi"]="100.87.87.80" ["OMVPi"]="100.87.87.80"
["OMV2000"]="100.87.87.81" ["OMV2000"]="100.87.87.81"
@ -54,57 +55,80 @@ declare -A HOSTS=(
["PROXI"]="100.87.87.100" ["PROXI"]="100.87.87.100"
["MATE3"]="100.87.87.108" ["MATE3"]="100.87.87.108"
["PC77"]="100.87.87.77" ["PC77"]="100.87.87.77"
["Nextcloud PTV"]="cloud.ptv-euregio.de"
["Nextcloud Alf"]="wralto.org"
["SPZSSH"]="alsdorf.spznord.de"
) )
TARGET_LABEL=$(gum choose --header "Zielsystem wählen" "${!HOSTS[@]}") 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")
log_info "SSH-Port: $TARGET_PORT"
# Benutzer-Auswahl # Hier unterscheiden zwischen Servern, die mittels einfachem PublicKey-Verfahren und solchen, die per zertifiziertem Schlüssel angesteuert werden.
USER_CHOICES=("alf" "root" "oberkoetter" "Benutzer manuell eingeben") case $TARGET_LABEL in
SSH_USER=$(gum choose --header "SSH-Benutzer wählen" "${USER_CHOICES[@]}") "Nextcloud Alf")
if [[ "$SSH_USER" == "Benutzer manuell eingeben" ]]; then log_info "Einfaches Login Nextcloud3"
SSH_USER=$(gum input --placeholder "SSH Benutzername") ssh ssh-test90969@wralto.org
fi log_info "Nextcloud3 fertig. ERR: $?"
log_info "Verwendeter Benutzer: $SSH_USER" ;;
# Gültigkeit wählen "Nextcloud PTV" | "SPZSSH")
VALIDITY_OPTIONS=("300" "600" "1800" "3600") # Sekunden log_info "Einfaches Login mit statischen PublicKey..."
VALIDITY=$(gum choose --header "Gültigkeitsdauer des Zertifikats wählen (Sekunden)" "${VALIDITY_OPTIONS[@]}") TARGET_PORT="22"
log_info "Zertifikatsgültigkeit: $VALIDITY Sekunden" ssh -p "$TARGET_PORT" -i "$SIMPLE_KEY" "$SSH_USER@$TARGET_HOST"
log_info " ERR: $?"
;;
# Schlüssel vorbereiten *)
mkdir -p "$KEY_DIR" TARGET_HOST="${HOSTS[$TARGET_LABEL]}"
cd "$KEY_DIR" log_info "Zielsystem gewählt: $TARGET_LABEL ($TARGET_HOST)"
log_info "Prüfe auf vorhandene temporäre Schlüssel" TARGET_PORT=$(gum input --placeholder "Ziel SSH Port" --value "2222")
rm -f "$KEY_NAME" "$KEY_NAME.pub" "$KEY_NAME-cert.pub" log_info "SSH-Port: $TARGET_PORT"
log_info "Generiere temporären SSH-Key" # Benutzer-Auswahl
ssh-keygen -f "$KEY_NAME" -N "" -C "$SSH_USER@temp" > /dev/null 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"
log_info "Sende Public Key zur CA (${CA_HOST})" # Gültigkeit wählen
scp -P "$CA_PORT" -i "$CA_KEY_PATH" "${KEY_NAME}.pub" "${CA_USER}@${CA_HOST}:/tmp/" || { VALIDITY_OPTIONS=("300" "600" "1800" "3600") # Sekunden
log_error "Fehler beim Senden des Public Keys zur CA" VALIDITY=$(gum choose --header "Gültigkeitsdauer des Zertifikats wählen (Sekunden)" "${VALIDITY_OPTIONS[@]}")
exit 1 log_info "Zertifikatsgültigkeit: $VALIDITY Sekunden"
}
log_info "Fordere Signatur von CA an..." # Schlüssel vorbereiten
ssh -i "$CA_KEY_PATH" -p "$CA_PORT" "${CA_USER}@${CA_HOST}" "$REMOTE_SIGN_SCRIPT /tmp/${KEY_NAME}.pub $SSH_USER $VALIDITY" || { mkdir -p "$KEY_DIR"
log_error "Fehler bei der Signierung durch die CA" cd "$KEY_DIR"
exit 1
}
log_info "Lade signiertes Zertifikat von CA" log_info "Prüfe auf vorhandene temporäre Schlüssel"
scp -P "$CA_PORT" -i "$CA_KEY_PATH" "${CA_USER}@${CA_HOST}:/tmp/${KEY_NAME}-cert.pub" . || { rm -f "$KEY_NAME" "$KEY_NAME.pub" "$KEY_NAME-cert.pub"
log_error "Fehler beim Abrufen des Zertifikats von der CA"
exit 1
}
log_info "Zertifikat erfolgreich erhalten starte SSH-Verbindung" log_info "Generiere temporären SSH-Key"
ssh -p "$TARGET_PORT" -i "$KEY_NAME" "$SSH_USER@$TARGET_HOST" ssh-keygen -f "$KEY_NAME" -N "" -C "$SSH_USER@temp" > /dev/null
log_info "Sende Public Key zur CA (${CA_HOST})"
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"
exit 1
}
log_info "Fordere Signatur von CA an..."
ssh -i "$CA_KEY_PATH" -p "$CA_PORT" "${CA_USER}@${CA_HOST}" "$REMOTE_SIGN_SCRIPT /tmp/${KEY_NAME}.pub $SSH_USER $VALIDITY" || {
log_error "Fehler bei der Signierung durch die CA"
exit 1
}
log_info "Lade signiertes Zertifikat von CA"
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"
exit 1
}
log_info "Zertifikat erfolgreich erhalten starte SSH-Verbindung"
ssh -p "$TARGET_PORT" -i "$KEY_NAME" "$SSH_USER@$TARGET_HOST"
;;
esac
log_end "SSH-Login abgeschlossen" log_end "SSH-Login abgeschlossen"

View File

@ -1,158 +0,0 @@
########## 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