Nützliche selbstgestrickte Scripte für die Alltagsadministration

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 19.03.2021 17:51:10

Welche Eure eigenen Scripte helfen Euch in der Alltagsadministration? Welche wären echt nütztlich, gibt es aber noch nicht?

Schreibt es hier rein!

Ich fange mal an:

Anzeigen wieviel Platz alle Pakete brauchen mit einem bestimmten Muster von Paketnamen

Zeigt z. B. an, wievel alle Pakete mit Namen "perl","ruby","php" oder "python" im Paketnamen:

Code: Alles auswählen

# program: pkgsize (function)
#
# purpose: summarize installed size of all packages with a given pattern
#                output in KB
#
# usage: pkgsize <regex>
#
# regex is embedded in .* for a wildcard match

pkgsize() {
        dpkg-query --show --showformat '${Package} ${Installed-Size} \n' \
                | awk -v muster=".*$1.*" '

                        function readable( input,     v,s )
                          {
                                split( "KiB MiB GiB TiB" , v )
                                if( input + 0.0 == input )   #confirms that the input is a number
                                   {
                                        while( input > 1024 ) { input /= 1024 ; s++ }
                                        return sprintf( "%0.2f %s" , input , v[s] )
                                   }
                                else
                                   {
                                        return input
                                   }
                          }

                        BEGIN {sum=0} 
                        match($0,"^"muster" "){sum=sum+$2} 
                        END {print readable(sum*1024)}'

}
Beispielaufrufe:

Code: Alles auswählen

$ pkgsize perl
147.35 MiB
$ pkgsize php
208.94 MiB
$ pkgsize ruby
12.56 MiB
$ pkgsize apache
638.00 KiB
Nachtrag: Die Zahlenformatierung kann man natürlich robuster mit numfmt umsetzen.
Zuletzt geändert von heisenberg am 26.03.2021 14:18:14, insgesamt 1-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
whisper
Beiträge: 3151
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 25.03.2021 20:13:35

1+ für den Thread!

Ich hatte mal vor Jahren einen Rechte Gau. Das damals verwendete Backup hatte beim Restore die Rechte der Dateien versaut.
Ich war selber schuld, weil ich halt direkt zurück gesichert hatte.
Deshalb läuft auf dem Server nun das hier:

Code: Alles auswählen

#!/bin/bash
#dateirechte.sh
DATUM=$(date +%d-%m-%Y)

nice getfacl -R -n / >/home/backup/dateirechte-$DATUM.txt
 
# wieder herstellen mit
#setfacl --restore=dateirechte.txt
Die Datei dateirechte.txt wird täglich mitgesichert und hilft versehentliche Änderungen zu reparieren
Ausserdem bei evtl. forensichen Vorfällen

mcb

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von mcb » 25.03.2021 21:11:58

Spannend !

Ich versuche gerade ein Script zu basteln das mir ein Kernelmodul nach dem Update signiert... Work in progress :oops:

Benutzeravatar
whisper
Beiträge: 3151
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 27.03.2021 11:56:37

Zählt ein Script, welches den Status der mailq anzeigt auch?
Also sowas als HTML

Code: Alles auswählen

Detaillierte Liste der Ziel-Domains

				             1Tag           2Tage     3Tage  länger 
				 6h 12h  18h  24h  30h  36h  42h  48h  54h  >54h
                              T 360 720 1080 1440 1800 2160 2520 2880 3240 3240+
                       TOTAL 17   3   1    0    1    1    0    0    3    2     6
               froscraft.com  1   0   0    0    0    0    0    0    0    1     0
              rattlebang.com  1   1   0    0    0    0    0    0    0    0     0
              shookstone.com  1   0   0    0    0    0    0    0    0    0     1
              rickylawns.com  1   0   0    0    0    0    0    0    0    0     1
             echienerart.com  1   0   0    0    1    0    0    0    0    0     0
            betterricher.com  1   0   0    0    0    0    0    0    0    0     1
            friarsonbase.com  1   0   1    0    0    0    0    0    0    0     0
          thehippyplanet.com  1   0   0    0    0    0    0    0    0    0     1
          solarsafepools.com  1   0   0    0    0    1    0    0    0    0     0
         onlynaturalepet.com  1   0   0    0    0    0    0    0    0    0     1
         farmvillemotels.com  1   0   0    0    0    0    0    0    1    0     0
        compositenations.com  1   1   0    0    0    0    0    0    0    0     0
       bluecareanywherea.com  1   1   0    0    0    0    0    0    0    0     0
      intractiveadvisers.com  1   0   0    0    0    0    0    0    1    0     0
      downtowntempetides.com  1   0   0    0    0    0    0    0    0    0     1
   marvincleaningservice.com  1   0   0    0    0    0    0    0    1    0     0
 abisiniaspecialtycoffee.com  1   0   0    0    0    0    0    0    0    1     0
Also nur für Leute, die einen Server mit postfix betreiben...
Egal, hier kommt es.
:mrgreen:

Code: Alles auswählen

#!/bin/bash
# Script zum Aufruf aus Cron heraus
# C GPL2 whisper 2021.03.27
# Crontab:
# 1 6,8,10,12,14,16,18,20,22 * * * /usr/local/sbin/mailq-2html.sh >/var/www/das.web.de/mailq.html 2>/dev/null
# Gibt eine Übersicht über die Postfix Mail Queue
#

echo ""
echo "<!DOCTYPE html>"
echo '<html lang="de">'
echo '<head>'
echo '<meta charset="UTF-8"/>'
echo '<title>Übersicht über die Mail queue</title>'
echo '<body>'
echo "<h1>Übersicht über die Mail queue</h1>"
echo -n "Stand: "
date
echo '<pre>'
for q in active  bounce  corrupt  deferred  flush  "hold  " incoming  maildrop saved

    do
        count=$(find /var/spool/postfix/$q ! -type d -print | wc -l)
        printf "$q   \t$count<br>"
    done

echo '</pre>'
echo '<hr>'
echo "<h1>Detaillierte Liste der Ziel-Domains</h1>"
echo '<pre><b>'
echo "                                       1Tag           2Tage     3Tage  länger "
echo "                           6h 12h  18h  24h  30h  36h  42h  48h  54h  >54h</b>"

# der export von PATH ist notwendig, weil das perl-script qshape intern noch postconf ausführt welches sonst nicht gefunden wird
# gezielt  /usr/sbin/qhape aufrufen reicht also nicht.
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

qshape -t 360 -l deferred

echo '</pre>'
echo "<b>Hinweis:</b> <i>Nach 4 Tagen wird der Zustellungsversuch abgebrochen und die E-Mail gelöscht.</i>"
echo '</body></html>'


Benutzeravatar
whisper
Beiträge: 3151
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 21.04.2021 20:45:48

Ein Fragment zum Thema Datumsberechnung

Code: Alles auswählen

GESTERN="$(date -d @$(($(date +%s) - 86400)) +%Y-%m-%d)"
In einem shell Script brauche ich manchmal das gestrige Datum, durch den Umweg über Unixtime bin ich den Ärger mit Monats- und Jahresgrenzen los.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von tobo » 21.04.2021 21:21:00

Date bietet da aber auch ein bisschen was:

Code: Alles auswählen

date -d yesterday "+%Y-%m-%d"

Benutzeravatar
whisper
Beiträge: 3151
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 21.04.2021 21:47:43

Mist! verdammter, kannte ich schon mal. lange her.
Super, gut das wir drüber geredet haben :facepalm: :mrgreen:

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 04.05.2021 09:36:49

Wenn man schauen will, wann ein entfernter Host nach einem reboot wieder da ist:

upcheck

Code: Alles auswählen

#!/bin/bash

#
#      program:         upcheck
#
#      purpose:         run an host upcheck continuously to see when a host is reachable again
#                       for example after issuing a reboot
#
#      usage:           upcheck <hostname> <additional ssh-arguments> 
#      
#      prerequisites:   passwordless ssh login should be configured from the current invoking account
#                       into the target system
#

mylog() { echo "$(date) : $*"; }

main() { 

        local myhost=$1
        shift
        while :;do 

                if ping -c1 -w3 $myhost &>/dev/null ; then 
                        if ssh_out="$(timeout 10 ssh $myhost "$@" date 2>&1)" ;then
                                mylog "  OK: host $myhost reachable"
                        else
                                mylog "FAIL: host $myhost ssh failed: $ssh_out"
                        fi
                else
                        mylog "FAIL: host $myhost ping failed"
                fi
                sleep 10
        done
}

main "$@"
Ausgabe

Code: Alles auswählen

$ upcheck fai -p1234
Di 4. Mai 09:27:00 CEST 2021 :   OK: host fai reachable
Di 4. Mai 09:27:10 CEST 2021 : FAIL: host fai ssh failed: ssh: connect to host fai port 1234: Connection refused
Di 4. Mai 09:27:20 CEST 2021 : FAIL: host fai ssh failed: ssh: connect to host fai port 1234: Connection refused
Di 4. Mai 09:27:31 CEST 2021 : FAIL: host fai ssh failed: ssh: connect to host fai port 1234: Connection refused
Di 4. Mai 09:27:43 CEST 2021 : FAIL: host fai ping failed
Di 4. Mai 09:27:56 CEST 2021 : FAIL: host fai ping failed
Di 4. Mai 09:28:07 CEST 2021 :   OK: host fai reachable
Di 4. Mai 09:28:18 CEST 2021 :   OK: host fai reachable
Ich hatte vor kurzem eine Linux-VM in einer total überlasteten VMWare Umgebung in Arbeit. Da hat der reboot mehrere Minuten gedauert. Da war es ganz besonders nützlich mit einem Blick zu sehen, wenn(bzw. ob) die VM wieder erreichbar ist.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 07.06.2021 19:19:41

Ein Script, dass gleichzeitig mehrere Hosts anpingt um Nichterreichbarkeiten/Wiederreichbarkeiten in einer kompakten Übersicht zu sehen:

Code: Alles auswählen

#!/bin/bash

#
#  ping several hosts simultaneously and display compact result
#
#  usage: multiping <hostname or ip> ...
#

declare -rx line_length=80

ping_all() {
        local i=0 h max proc host char

	# fire up ping processes
        for h in "$@";do
                ping -c1 -w1 $h &>/dev/null &
                host[$i]=$h
                proc["$i"]="$!"
                max=$i
                ((i++))
        done
        
        # collect finished ping results
        for((i=0;i<=max;i++));do
                char=X
                wait ${proc[$i]}
                [ $? -eq 0 ] && char=.
                status_line[$i]="${status_line[$i]}$char"
                [ ${#status_line[$i]} -gt $line_length ] \
                        && status_line[$i]="${status_line[$i]:$((${#status_line[$i]}-$line_length))}"
        done

        # print results
        clear
        echo -e "multi ping\n"
        for((i=0;i<=max;i++));do
                echo "$(printf "%-25s" ${host[$i]}) ${status_line[$i]}"
        done
        echo -e "\ntype [Ctrl] + [c] to abort\n"
}

while : ; do
        ping_start=$(date +%s.%N)
        ping_all "$@"
        ping_end=$(date +%s.%N)

        # take exactly 1.1 seconds for each ping-round, with or without failed timed out ping
        pause_len="$(echo "scale=3;1.1 - ($ping_end - $ping_start)"|bc)"
        pause_100=$(echo "scale=0;$pause_len * 100"|bc)
        pause_len=$(sed -r -e 's/^\./0./' <<<"$pause_len")
        [ ${pause_100%.*} -lt 100 ] || sleep $pause_len
done

Benutzungsbeispiel:

Code: Alles auswählen


$ multiping ntp1 ntp2 koala fai noc

Multiping

ntp1                      ................................................................................
ntp2                      .............................................XXXXXXXXX..........................
koala                     ................XXXXXX..........................................................
fai                       ................................................................................
noc                       ................................................................................

type [Ctrl] + [c] to abort

Die Zeichen wandern nach links um neuen ping-Ergebnissen Platz zu machen.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Prüfung ob SSL Cert + Key zusammenpassen

Beitrag von heisenberg » 21.09.2021 12:26:44

Prüfung ob SSL-Zertifikat und Key zusammenpassen:

Code: Alles auswählen

#!/bin/bash
#
#
#       check if a given PEM certificate file and a private Keyfile fit together
#
#       do this by comparing the modulus of the key and the cert
#
#	Usage: thisprog <cert-file> <key-file>
#

export LC_ALL=C

get_crt_cksum() { openssl x509 -modulus -noout -in "$1" | openssl md5 ; }
get_key_cksum() { openssl rsa  -modulus -noout -in "$1" | openssl md5 ; }

get_cksum() {

        local target_file="$1"

        [ -e "$target_file" ] || eexit 1 "file $target_file does not exist"
        [ -r "$target_file" ] || eexit 2 "file $target_file is not readable"
        [ -s "$target_file" ] || eexit 3 "file $target_file empty"
        [ -f "$target_file" ] || eexit 4 "file $target_file is not a regular file"

        local file_type="$(file $target_file)"

        if [[ "$file_type" =~ PEM\ certificate$ ]] ; then
                _return_value_g="$(get_crt_cksum "$target_file"|awk '{print $NF}')"
                crt_cksum_g="$_return_value_g"
                crt_processed_g=1
                return
        fi

        if [[ $file_type =~ PEM\ RSA\ private\ key$ ]] ; then
                _return_value_g="$(get_key_cksum "$target_file" | awk '{print $NF}')"
                key_cksum_g="$_return_value_g"
                key_processed_g=1
                return
        fi

}

eexit() {

        # exit with specified error code and print specified error text to stderr
        rc=$1
        shift
        {
                echo
                echo "error: $*"
                echo "exiting"
                echo
        } >&2
        exit $rc
}

main() {

        [ $# -eq 2 ] || eexit 5 "usage: $(basename $0) <cert-file> <key-file>"

        get_cksum "$1"; local file1_sum="$_return_value_g"
        get_cksum "$2"; local file2_sum="$_return_value_g"

        # for convenience: parameters cert-file and key-file may be in any order

        [ "$crt_processed_g" == "1" ] || eexit 6 "file $1 is not a certificate file"
        [ "$key_processed_g" == "1" ] || eexit 7 "file $2 is not a key file"

        echo 
        if [ "$file1_sum" == "$file2_sum" ] ; then
                echo "OK: File Modulus checksums match: Certificate Matches Key: All fine!"
                echo
                exit 0
        else
                echo "ERROR: File Modulus checksums do not match: Certificate-File(mod-md5: $crt_cksum_g) does not match Key-File(mod-md5: $key_cksum_g)!"
                echo 
                exit 1
        fi
}

main "$@"
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 17.01.2022 19:13:42

Ein Script für Borg-Backup, das eine Backup-Rotation verschiedener Intervalle umsetzt(täglich, wöchentlich, ...):

https://codeberg.org/megabert/script-pa ... rg_rotated

Finde ich eine Verbesserung für das Szenario, bei dem ich bisher rsnaphot einsetze. Verbessung durch Platzeinsparung durch die Deduplizierung(im Vergleich zum hardlinkbasierten System von rsnapshot und auch geringere Anzahl von Dateien, dadurch, dass in einem in Blöcken geteilten Archivformat gespeichert wird) In Kombination mit dem automounter ist der direkte Zugriff wie auch bei rsnapshot da.

Nachtrag: Da gibt es schon einen wrapper, der das gleiche - nur viel besser - kann: Debianborgmatic
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Spamassassin Rule Generator

Beitrag von heisenberg » 17.02.2022 18:51:24

Ich hole mal etwas aus...

Ein weiteres Script... Ich habe auf meinem privaten VServer ein fetchmail, das mir von diversen Konten meine Mails abholt von zwei lokalen Usern aus. Die E-Mailadressen habe ich schon ewig. D. h. dementsprechend spamverseucht sind die(also habe auch nicht besonders darauf geachtet, dass ich wirklich nur strikt getrennt benutze). Ausgehend versende ich über Smarthost über die entsprechenden Providerserver.

Ich schreibe meine Mails über Roundcube(webmailer) und habe dort die Erweiterung "automatic addressbook" aktiv. D. h. jede E-Mailadresse, an die ich eine E-Mail versende wird in eine MySQL-Datenbank geschrieben.

Vor kurzem bin ich da drüber gestolpert, weil ich die Spamfilter der Provider auf Maximimum eingestellt habe. Dann hatte ich vor kurzem eine internationale Veranstaltung und genau alle E-Mails sind mir da weggefiltert worden. 1 Monat später habe ich es zufällig gemerkt.

In der Folge habe ich jetzt alle Provider-Spamfilter abgeschaltet und möchte selber filtern.

Spamfilter

Es geht also, darum in meinem Setup einen Spamfilter zu konfigurieren. Grundsätzlich nehme ich dafür Debianspamassassin(SA), der ja das Referenzprojekt in dem Bereich ist. Den binde ich bei mir über Sieve ein, und zwar so:

Bei mir ist das die Datei $HOME/.dovecot.sieve:

Code: Alles auswählen

# Wenn noch mehrere Sieve-Module aktiv sind, müssen die alle in der nächsten Zeile eingefügt sein.
require [ "vnd.dovecot.execute" ];

if not execute :pipe "spamassassin" {
        setflag "\\Seen";
        fileinto "spam";
        stop;
}
Das obige bedeutet, dass, wenn die Mail von SA als Spam erkannt wird, d. h. das Programm spamassassin mit Exit-Status > 0 beendet wird, dann markiere ich die Mail als gelesen und sortiere die Mail in meinen existierenden Ordner "spam" ein und beende dann die Verarbeitung.

Das Programm spamassassin ist ein kleines Wrapper-Script, dass bei mir als /usr/lib/dovecot/sieve-execute/spamassassin abgelegt ist und so aussieht:

Code: Alles auswählen

#!/bin/bash

/usr/bin/spamc --check >/dev/null 2>&1
Die SA-Benutzer-Konfiguration ist in der Datei $HOME/.spamassassin/user_prefs abgelegt. Die Benutzerkonfiguration ist per Vorgabe erst einmal ausgeschaltet, weil das für einen Mailserver bzgl. der Performance erst einmal nachteiligt ist, wenn da auch noch Benutzer-Regelsätze ausgewertet werden sollen. Deswegen musste ich die erst einmal aktivieren mit der Einstellung ...

Code: Alles auswählen

allow_user_rules 1
... in der Datei /etc/spamassassin/local.cf ganz am Ende. Anschließend einmal Spamassassin neu starten.

Erfahrungen

SA filtert bei mir die Mails in der Standardeinstellung nicht gut weg - obwohl die Dokumentation anderes behauptet. Da kommt immer noch sehr viel durch. Deswegen habe ich überlegt eine Wortliste mit Gewichtung zu implementieren, für die ich dann entsprechende SA-Regeln generiere.

Um False-Positives zu vermeiden generiere ich ebenso Regeln mit negativem Punktewert für alle E-Mailadressen, an die ich schon einmal eine E-Mail geschickt habe, in dem ich die Adressen dafür aus dem automatischen Adressbuch der MySQL-Datenbank extrahiere.

Meine Wortliste ist hier: https://codeberg.org/megabert/script-pa ... _words.txt
Das Programm ist hier: https://codeberg.org/megabert/script-pa ... user_prefs

Bis jetzt scheint das alles super zu funktionieren. Wer meine Spamwords nutzen will, sollte die genau prüfen, ob das für Ihn selbst auch wirklich passt. Die Score-Werte sind für mich bei den Spamwords normalerweise von 1-4, wobei 4 der Default-Wert ist. Für SA ist ein Gesamtwert ab 5 eine Spam-Mail. Einmal habe ich auch den Wert 10000 gesetzt. Das ist für ein Wort, wenn das ist einer Mail auftaucht, auch von Bekannten, so will ich diese Mails trotzdem unbedingt als Spam einsortieren.

Den negativen Score für Bekannte Adressen habe ich auf -100 gesetzt. Es kann ja sein, dass mal ein Bekannter lange rumranted und dabei diverse Trigger-Wörter verwendet. -100 sollte dafür ausreichend sein, dass die Mail trotzdem durchkommt.

Weiterhin vorsicht mit sehr kurzen Wörtern und Wörtern, die z. B. in HTML-Mails im Syntax-Code auftauchen. Z. B. "Mode".

Hier mal ein Auszug aus dem generierten Regelsatz:

Code: Alles auswählen

# AUTO_USER_PREFS_START

# AUTO MAIL-BODY RULES 
body USER_BODY_RULE_0002 /\bgewicht/i
body USER_BODY_RULE_0004 /\bamerican express/i
body USER_BODY_RULE_0005 /\bmastercard/i
body USER_BODY_RULE_0006 /\bKreditkarte/i
body USER_BODY_RULE_0007 /\bentdecken/i
body USER_BODY_RULE_0008 /\berlebnis/i
body USER_BODY_RULE_0009 /\babenteuer/i
...

# AUTO MAIL-BODY RULES SCORES 
score USER_BODY_RULE_0002     3
score USER_BODY_RULE_0004     1
score USER_BODY_RULE_0005     1
score USER_BODY_RULE_0006     1
score USER_BODY_RULE_0007     1
score USER_BODY_RULE_0008     1
score USER_BODY_RULE_0009     1
...

# AUTO RULES KNOWN EMAIL ADDRESSES
header FROM_KNOWN_USER_00002 From =~ /bla@blub.de/
header FROM_KNOWN_USER_00003 From =~ /oops@hurz.com/
...

# AUTO RULES KNOWN EMAIL ADDRESSES SCORES - ALL THE SAME
score  FROM_KNOWN_USER_00002 -100
score  FROM_KNOWN_USER_00003 -100
...

# AUTO_USER_PREFS_END
Zuletzt geändert von heisenberg am 19.02.2022 22:28:38, insgesamt 3-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von rodney » 17.02.2022 20:06:53

@heisenberg: Die Idee gefaellt mir und auch die Umsetzung, jedoch haette ich da eine Frage:

Wie kann anstelle der SQL-Abfrage in Zeile 54 die Variable email_addresses mit einer Liste bzw. Text-Datei (pro Zeile eine E-Mail-Adresse) befuellt werden?

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 17.02.2022 20:34:42

Du musst diese Zeile verändern...

Code: Alles auswählen

email_addresses="$(mysql_get_known_addresses "$dbname" "$user" "$pass")" 
... in ...

Code: Alles auswählen

email_addresses="$(cat $HOME/pfad/datei)"
und natürlich noch den überflüssigen MySQL-bezogenen Code entfernen.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von rodney » 17.02.2022 20:38:00

Danke. Die MySQL-Teile sind schon entfernt

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 23.02.2022 13:53:09

Bzgl. sa_generate: War noch ein kritischer Fehler drin. Das @-Zeichen musste geschützt werden(@ ist das Array-Variablen-Prefix in Perl). Ist im Codeberg-git-repo behoben.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

curt123
Beiträge: 704
Registriert: 19.10.2018 12:49:35
Wohnort: NRW

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von curt123 » 27.02.2022 14:25:40

Ein einfaches Script zur Anpassung von Zeitstempeln.

Beim Backup stimmten teilweise die Zeitangaben nicht mehr (OS, falsche Zeitzone oder Zeitumstellung?) und mussten um eine Stunde angepasst werden.

Wahrscheinlich geht es einfacher und kompakter, ähnlich wie hier im thread mit "yesterday" z.B. schon bei date:

Code: Alles auswählen

echo $(date -d "1 hour ago" )
Das Script sollte -Programmierstil- gut lesbar/nachvollziehbar und hinreichend dokumentiert sein

Code: Alles auswählen

#!/bin/bash
#===================================================================================
#
#           FILE: ftc
#
#          USAGE: ftc file(s) (+)/-hours)
#                    ftc * -1
#                    ftc sample-a.txt sample-b.txt 2
#    DESCRIPTION: Change a files modified time. Stepwise  by hours.
#                 To correct data for different time zones
#
#   REQUIREMENTS: Must be executable and in path or same directory
#
#         AUTHOR: CKL
#    ENVIRONMENT: OS Debian 11
#        VERSION: 1
#        CREATED: 2021-03-24 - 16:35
#       REVISION: 2021-03-29 - 14:52
#===================================================================================

args=("$@")

#---- information about user errors
if (( $# < 2 )); then
   echo "${0} "$'\n'"Syntax: $(basename ${0}) file(s) +-hours"
   exit 1
elif [[ ! ${args[-1]} == ?(-)+([0-9]) ]]; then
   echo "Fehler: Zeitangabe fehlt oder ${args[-1]} ist kein numerischer Wert"
   read -p 'Anzahl der Stunden eingeben oder STRG C ' stunden
   $0 "$@" $stunden
   exit $?
fi

#---- get old date-time, add n hours, convert format, set new date-time
hour_shift () {
   tmp=$(stat -c %Y "$1")
   tmp=$((tmp + 60*60 * $2 ))
   tmp=$(date +%Y%m%d%H%M.%S --date @$tmp)
   touch -c -m -t $tmp "$1"
   if [[ ! $? -eq "0" ]]
      then
         echo "Problem mit ${1}"
      else
         echo "Erfolg bei ${1}"
fi
}

file_check_run () {
   if [[ ! -f "$1" ]]
      then
         echo "${1} nicht gefunden oder Verzeichnis"
      else
         hour_shift "$1" $2 
   fi

}

#---- multiple files: walk through args array
for ((n=0; n < $#-1; n++)) {
   file_check_run  "${args[$n]}" ${args[(($#-1))]}
}

#===================================================================================
#   END

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 06.04.2022 15:53:10

Bgzl. sa_generate:

Es treten recht häufig Mails auf, die fälschlicherweise als Spam erkannt werden. Ich habe deswegen in meinem Mailclient einen Ordner "to_scan" angelegt. Dorthinein verschiebe ich alle Mails die falsch erkannt wurden.

Ich habe das Script erweitert, dass die Absender dieser Mails darin zusätzlich auf die Whitelist kommen. Der Generator wird jetzt einmal täglich per Cron ausgeführt.

https://codeberg.org/megabert/script-pa ... user_prefs
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
whisper
Beiträge: 3151
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 08.08.2022 08:29:11

Ein einfaches Script, an dem ich ein paar Sachen ausprobiert habe.
U.a. Das anpassen der Ausgabe in Abhängigkeit von der Anzahl der $LINES.

Code: Alles auswählen

#!/bin/bash
# cert-ablauf-tst.sh
# bed@zockertown.de
# (c) GPL 3
# Spielwiese für script
#Entweder der Aufruf ohne Parameter, dann werden alle Domains ausgegeben.
#Oder Aufruf mit einem Teilstring einer Domain oder Domaingruppe
#
bold=$(tput bold)
normal=$(tput sgr0)
#gelb=$(tput setaf 3)
gruen=$(tput setaf 2)
black=$(tput setaf 0)
if [ $# -eq 1 ]
then
	
	if [ -z "$(ls /var/www/*$1*/ssl/*-le.crt 2>/dev/null)" ]
	then
		echo "$bold$0"
		echo "Gebrauch:$normal"
		echo "Entweder der Aufruf ohne Parameter, dann werden alle Domains ausgegeben."
		echo "Oder Aufruf mit einem Teilstring einer Domain oder Domaingruppe$bold"
		echo "Beispiel:$normal"
		echo "$0 $bold braun$normal"
		exit 1
	fi
	set "$(ls /var/www/*$1*/ssl/*-le.crt)"

else
	set "$(ls /var/www/*/ssl/*-le.crt)"
fi

declare -i N
N=5
clear
format="%-45s %-55s\n"
echo -n "$bold"
printf "$format" "cert-ablauf der gehosteten Domains" "          Datum$normal"

for I in $*
do
	echo -n "$black"
	DOM="$(echo $I|cut -d'/' -f4): "
	ABL="$gruen$(openssl x509 -noout -dates -in $I|grep --color=auto notAfter)"
	printf "$format" "$DOM$normal"  "$bold$ABL$normal"
	echo
	N=$N+2
	if [ $N -gt $LINES ]
	then
	echo -n "<$bold Return$normal > für weitere Ergebnisse"
	read dummy
	fi
done
Nur 1:1 nutzbar auf einem ISPConfig System.
Es schreibt nichts, sollte Safe sein.
edith: Nicht, dass ISPConfig das nicht selbsttätig könnte, das Script ist während der Serverumstellung nur zur Kontrolle und eben als Experimentier Script nützlich.
Zuletzt geändert von JTH am 08.08.2022 09:23:42, insgesamt 1-mal geändert.
Grund: Das schließende [/code] an die richtige Stelle verschoben

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 12.08.2022 22:24:50

Ich habe gerade die Verwendung von IP-Blocklisten mit Postfix und SSH ausprobiert. Bei Postfix bringen die Listen nicht wirklich viel. Bei SSH aber schon sehr.

Siehe:
https://codeberg.org/megabert/script-pa ... -blocklist
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Scripte für Nextcloud Management, Monitoring und Upgrade

Beitrag von heisenberg » 01.11.2022 15:20:42

Ein paar Scripte zum automatischen Updaten und überwachen von Nextcloud. Die sind alle nicht so generisch und müssen an die eigene Umgebung angepasst werden. Als Vorlage für eigene Automatisierung bestimmt ganz hilfreich.

https://codeberg.org/megabert/script-pa ... /nextcloud
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 30.10.2023 15:37:39

Hallo,

mich nervte gerade mal wieder die Einschränkung von Cron, dass es keine einfache Lösung für die Ausführung eines Programmes am x. Wochentag im Monat gibt. (Systemd ist keine Option hier)

Ich hatte deswegen diesen üblichen Workaround verwendet:

Code: Alles auswählen

# full backup every week on first saturday in month
0       16     1-7       *       *      root [ "$(LC_ALL=C date '+%a')" == "Sat" ] && /usr/local/bin/mybackup
Der hat aber leider nicht funktioniert. Ich habe das jetzt nicht zu Ende getestet, sondern mir einfach einen Wrapper geschrieben, der das macht.

codeberg.org script: run_at_nth_wday
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
Livingston
Beiträge: 1363
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von Livingston » 30.10.2023 17:19:04

Für POSIX-Kompatiblität wird "=" statt "==" empfohlen, wenn man [...] benutzt.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 30.10.2023 17:24:30

Diese Zeile am Anfang meiner Cron-Datei (/etc/cron.d/mybackup) habe ich noch unterschlagen:

Code: Alles auswählen

SHELL=/bin/bash
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
Livingston
Beiträge: 1363
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von Livingston » 30.10.2023 21:03:45

cron hat's ja nicht so mit Variablensubstitution & Co. Hast Du mal versucht, den Block

Code: Alles auswählen

[ "$(LC_ALL=C date '+%a')" == "Sat" ]
direkt in /usr/local/bin/mybackup zu packen (natürlich mit if-Abfrage drumrum)?
Eigentlich sollte das trotz allem so, wie Du's ursprünglich gepostet haben, funktionieren. Strange :?

Oder wie wär's mit

Code: Alles auswählen

[ $(date +\%u) -eq 6 ] && /usr/local/bin/mybackup
Kommt ohne Variablen aus.

NACHTRÄGLICHE ERLEUCHTUNG: Das % muss mit "\" maskiert werden.
man 5 crontab hat geschrieben: Das »sechste« Feld (der Rest der Zeile) legt den auszuführenden Befehl fest. Der gesamte Befehlsanteil der
Zeile, bis zu einem Zeilenumbruch oder dem %-Zeichen wird durch /bin/sh oder der durch die Variable SHELL der
Crontab-Datei festgelegten Shell ausgeführt. Prozentzeichen (%) im Befehl werden in Zeilenumbruchzeichen umge‐
wandelt, falls sie nicht mit dem Rückwärtsschrägstrich (\) maskiert sind und alle Daten nach dem ersten % wer‐
den an den Befehl als Standardeingabe gesandt. Es gibt keine Möglichkeit, einen einzelnen Befehl auf mehrere
Zeilen aufzuteilen, wie mit dem abschließenden »\« der Shell.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Antworten