Hey zusammen.
Ich hab mir hier ein Script gemacht um eine Gruppe von Raspberrys mit identischer Softwarekonfiguration gleichzeitig oder einzeln Anzusprechen um bestimmte vordefinierte Befehle auszuführen.
Um die Clients anzusprechen habe ich ein txt-File auf einem Webserver gespeichert welche dann von den Clients heruntergeladen und ausgewertet wird. Um zu verifizieren dass die Befehle von mir kommen habe ich noch eine Berechnung für einen Verifizierungscode eingebaut welcher stetig wechselt. Somit sollte verhindert werden dass jemand anderes die Clients ansprechen kann.
Es können (so hoffe ich) auch nicht direkt Befehle in die txt-Datei eingetragen werden da die zeilen jeweils mit einem remote_ zu beginn ausgeführt werden.
Beispielausgabe bei "sudo reboot": remote_sudo reboot = error
Besipielausgabe Funktion: remote_setusr pi = Ok
Ich habe jetzt keine spezifische Frage zum Script selber sondern eher ob ich da irgend ein Überlegungsfehler gemacht habe bzw ob da bei dieser Methode evt Probleme auftreten könnten an welche ich noch nicht gedacht habe.
EDIT: Ja es gibt fertige Lösungen. Ich möchte jedoch meine Fertigkeiten im Programmieren etwas festigen und hab mir schon länger überlegt was für ein "sinnvolles" Script ich schreiben könnte. Falls mein Ansatz nicht völlig für die Tonne ist bevorzuge ich eine DIY-Lösung.
Grüsse Apop
Wer sich das Script etwas genauer ansehen will:
#!/bin/bash
#Scriptversion
readonly VERSION_NOW="1"
#Telegram Informationen
readonly BOT_ID=''
readonly CHAT_ID=''
readonly TELEURL='https://api.telegram.org/bot'
#Konstanten
readonly COMMANDLIST=$HOME/remote.txt #Heruntergeladene remote-datei
readonly UPDATE_URL='http://url.to.file/update.txt' #Quelle update.txt
readonly REMOTE_URL='http://url.to.file/remote.txt' #Quelle remote.txt
readonly SYSUD_TMP=/var/tmp/rem_update.tmp #Systemremote_update
readonly REBOOT_TMP=/var/tmp/rem_reboot.tmp #Pi Neustarten
readonly LOGFILE=$HOME/remote_master.log #Logfile
readonly MAXLINES=49 #Maximale Anzahl Zeilen im Logfile +1
readonly STARTUPDATE="$HOME/scripts/remotescript/updateclient.sh &" #Updatescript
readonly ENCRYPT="$HOME/scripts/remotescript/encrypt.sh"
touch $LOGFILE
#-----FUNKTIONEN-BENUTZERERKENNUNG-UND-VERIFIZIERUNG------
#Funktion Verifizierungscode
function remote_verify {
inp_code=$*
export code_hex=$inp_code
ver_code=$($ENCRYPT)
verify_check
}
function verify_check {
if [ "$ver_code" != "OK" ]; then
exit 0
fi
}
#Funktion Username setzen und prüfen
function remote_setuser {
verify_check
REMOTEUSER=$*
if [ "$USER" == "$REMOTEUSER" ] || [ "$REMOTEUSER" == "alle" ]; then
userstatus=ok
log Verifizierung OK. Ausführen der Funktionen von remote.txt.
client_update
else
exit 0 #Error: Wrong user!
fi
}
#------------------USER-FUNKTIONEN------------------------
#Funktion Statusnotification
function remote_status {
if [ "$userstatus" == "ok" ]; then
log Ausgeführte Funktion: status
gather_status
fi
}
#Funktion PiHole - Update
function remote_piholeupdate {
if [ "$userstatus" == "ok" ]; then
log Ausgeführte Funktion: piholeupdate
pihole -up
log PiHole-Software aktualisiert.
MESSAGE="User:$USER: Pi-Hole Software wurde aktualisiert"
message_send
fi
}
#Funktion PiHole - Domain zu Whitelist hinzufügen
function remote_piholeaddwhite {
if [ "$userstatus" == "ok" ]; then
ph_list=$*
log Ausgeführte Funktion: piholeaddwhite
pihole -w $ph_list
log Domain [$ph_list] wurde zur PiHole-Whitelist hinzugefügt
MESSAGE="User:$USER: Pi-Hole Whitelist aktualisiert"
message_send
fi
}
#Funktion Funktionen auflisten
function remote_function {
log Ausgeführte Funktion: function
MESSAGE=$(declare -F | grep -e remote | cut -d_ -f2)
MESSAGE="Verfügbare Funktion von User [$USER]: $MESSAGE"
message_send
log Verfügbare Funktionen übermittelt
}
#------------------ROOT-FUNKTIONEN------------------------
#Funktion Update
function remote_update {
if [ "$userstatus" == "ok" ]; then
touch $SYSUD_TMP
log Ausgeführte Funktion: remote_update
fi
}
#Funktion Neustart
function remote_neustart {
if [ "$userstatus" == "ok" ]; then
touch $REBOOT_TMP
log Ausgeführte Funktion: remote_neustart
fi
}
#-----------VOM-SCRIPT-VERWENDETE-FUNKTIONEN--------------
#Falls neue Version verfügbar Script updaten
function client_update {
version_new=$(curl $UPDATE_URL 2>/dev/null)
if [ "$version_new" != "$VERSION_NOW" ]; then
$STARTUPDATE
log Neues Update verfügbar - Starte Updatescript
exit 0
fi
}
#Logfilefunktion mit Zeilenbeschränkung
function logsetup {
TMP=$(tail -n $MAXLINES $LOGFILE 2>/dev/null) && echo "${TMP}" > $LOGFILE
exec > >(tee -a $LOGFILE)
exec 2>&1
}
function log {
echo "$(date +"%d.%m.%Y - %H:%M:%S"): $*"
}
function message_send {
sleep 5
curl -s -k "$TELEURL$BOT_ID/sendMessage" -d text="$MESSAGE" -d chat_id=$CHAT_ID 1>/dev/null
}
#------------------UNTERFUNKTIONEN-------------------------
#Unterfunktion zur Geräteanalyse (remote_status)
function gather_status {
#Defaultausgaben:
ssh_stat=OFF
piho_stat=OFF
vpn_stat=OFF
f2b_stat=OFF
ftp_stat=OFF
vnc_stat=OFF
#Informationen zusammenstellen
readonly PUB_IP=$(wget -qO - http://myip.dnsomatic.com/ 2> /dev/null)
readonly LAN_IP=$(hostname -I)
readonly LASTBOOT=$(uptime -s)
readonly BANNED_IP=$(awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n)
#Prüfe Services
if (( $(ps ax | grep "sshd" | wc -l) > 0 )); then
ssh_stat=ON
fi
if (( $(ps ax | grep "pihole" | wc -l) > 0 )); then
piho_stat=ON
fi
if (( $(ps ax | grep "openvpn" | wc -l) > 0 )); then
vpn_stat=ON
fi
if (( $(ps ax | grep "fail2ban" | wc -l) > 0 )); then
f2b_stat=ON
fi
if (( $(ps ax | grep "ftp" | wc -l) > 0 )); then
ftp_stat=ON
fi
if (( $(ps ax | grep "vnc" | wc -l) > 0 )); then
vnc_stat=ON
fi
#Sende Nachricht
MESSAGE="User: [$REMOTEUSER] | pubIP: [$PUB_IP] | lanIP: [$LAN_IP] | SSH: [$ssh_stat] | VNC: [$vnc_stat] | PiHole: [$piho_stat] | VPN: [$vpn_stat] | Fail2Ban: [$f2b_stat] | FTP: [$ftp_stat] | Uptime: [$LASTBOOT] | Gebannte IP: [$BANNED_IP]"
message_send
log Allgemeine Statusangaben übermittelt
}
#-----------------------AUSFÜHREN DER FUNKTIONEN DURCH remote.txt--------------------------
#Lese Remotedatei aus
wget $REMOTE_URL &>/dev/null
check=$(cat $COMMANDLIST)
#Lade Remotebefehle und führe sie aus.
if [ "$check" != "" ]; then
logsetup
while IFS= read -r var
do
remote_$var
done < $COMMANDLIST
fi
rm $COMMANDLIST
exit 0
Alles anzeigen