Suche
Suche Menü

Linux bash – Lockfiles

Um während einer Scriptausführung eine parallele Ausführung des selben Scirpts zu verhindern, kann man dazu ein Lockfile einsetzen.

Hier ein Beispiel wie der Lock aufgebaut werden kann:

#!/bin/bash

lockfile=~/lockfile.lock

# Check is Lock File exists, if not create it and set trap on exit 
if { set -C; 2>/dev/null >${lockfile}; }; then
         trap "rm -f ${lockfile}" EXIT
else
         echo "Lock file exists… exiting"
         exit
fi

# Do Something, Main script work here…  
echo "I am a script and I am doing something… anything…"  
sleep 30

Weitere Beispiele und Möglichkeiten finden sich hier:

https://www.putorius.net/lock-files-bash-scripts.html

Spaltenmodus in Notepad++

Von Ultraedit und Eclipse bin ich mir gewohnt mit dem Spaltenmodus zu arbeiten. Im Notepad++ fehlte mir diese Funktion jedoch. Vorhin habe ich entdeckt wie diese Funktionalität umgesetzt ist.

Alt+C öffnet den Spaltenmodus (Block-Editor). Der Befehl findet sich auch im «Bearbeiten»-Menü. Allerdings lässt sich damit nicht viel steuern. Nun ist der Einsatz als Spalteneditor simpel über reine Tasten respektive Tasten/Maus Steuerung gelöst.

Mit Alt+Shift+Cursor Tasten kann man eine Spalte selektieren.

Mit Alt+Mauszeiger ziehen lässt sich ebenfalls eine Spalte selektieren

Sollen fortlaufende Nummern in die Zeilen eingefügt werden, mit einem der obenstehenden Befehle den entsprechenden Bereich markieren. Dann mit Alt+C den Block Editor öffnen und die Option «Zahlen einfügen» wählen. Hier kann der Startwert und der Interval definiert werden.

Cronjob auf QNAP einrichten

Damit ich das nächste Mal nicht suchen muss, dokumentiere ich hier, wie auf einem QNAP NAS ein Cronjob eingerichtet werden kann.

Mit folgendem Befehl können die aktuellen Cronjobs angezeigt werden:

crontab -l

Der normale Befehl crontab -e funktioniert auf QNAP nicht, da dieser bei einem Neustart des Geräts überschrieben werden würde. Deshalb muss die Crontab Datei direkt bearbeitet werden.

vi /etc/config/crontab

Nach dem die Cronjobs angepasst und die Datei gespeichert wurde, muss das Crontab file neu geladen und der cron daemon neu gestartet werden.

crontab /etc/config/crontab && /etc/init.d/crond.sh restart

Postfix als Send-Only-SMTP Server installieren und konfigurieren

Um auf einem Linux Server (in meinem Beispiel Ubuntu) Mails versenden zu können, kann Postfix als SMTP Server konfiguriert werden.

Postfix installieren

Postfix lässt sich am schnellsten mit den Mail-Utils installieren

sudo apt update
sudo apt install mailutils

Während der Installation fragt Postfix nach dem Modus in dem es installiert werden soll

Als Standard-Option ist «Internet Site» vorbelegt. Dies ist für unseren Anwendungsfall korrekt. Sollte diese Meldung während der Installation nicht erfolgen, so kann dies mit folgenem Befehl die Konfiguration von Postfix nochmals durchgeführt werden:

sudo dpkg-reconfigure postfix

Anschliessend den Namen des Servers festlegen. Der System-E-Mail-Name muss gleich sein wie der Name, welcher deim erstellen des Servers diesem zugewiesen wurde.

Konfiguraton von Postfix

Nun muss die Konfiguration von Postfix angepasst werden, so dass die E-Mails über einen externen SMTP Server versandt werden können.

sudo nano /etc/postfix/main.cf

Folgende Zeilen müssen angepasst werden (bestehende Werte ersetzen)

inet_interfaces = loopback-only
mydestination = localhost.$mydomain, localhost, $myhostname

SMTP Authentification über SASL aktivieren

In der main.cf folgende weiteren Zeilen erweitern (relayhost ist bereits im File vorhanden)

smtp_use_tls = yes
smtp_tls_wrappermode = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

relayhost = [mail.domain.ch]:465

–> relayhost muss mit dem genutzten Mailserver ergänzt werden.

sasl_passwd Datei erstellen

Nun die sasl_passwd Datei erstellen

sudo nano /etc/postfix/sasl_passwd

Folgenden Inhalt einfügen:

[mail.domain.ch]:port user:pass
Anschliessend die Datenbank hashen

sudo postmap /etc/postfix/sasl_passwd

Nun Postfix neustarten

sudo service postfix restart

Test-E-Mail versenden

Über folgenden Befehl kann nun getestet werden ob E-Mails über Postfix versandt werden können:

echo "Das ist der E-Mail Inhalt!" | mail -s "Betreff des Mails" -a "From: absender@domain.ch" empfaenger@domain.ch

Sollte kein E-Mail ankommen, so kann im Logfile nachgeschaut werden was Postfix zurückmeldet:

tail -100 /var/log/mail.log

Absenderadresse fix einstellen

Je nach dem kann es sinn machen, eine fixe E-Mailadresse als Absender einzustellen, da über den SMTP Server nur definierte E-Mailadressen oder Domains verwendet werden können. Diese Konfiguration ändert die Absenderadressen sowohl von lokalem als auch von weitergeleitetem SMTP-Mailverkehr:

In der /etc/postfix/main.cf folgendes einfügen:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

Rewrite der Absenderadresse von E-Mails, die vom Server selbst stammen.

In der /etc/postfix/sender_canonical_maps folgendes hinterlegen:

/.+/    adresse@domain.ch

Rewrite von Adressen welche über SMTP relayed wurden

In der /etc/postfix/header_check folgendes hinterlegen:

/From:.*/ REPLACE From: adresse@domain.ch

Mac spezifische Dateien .DS_Store und __MACOSX Ordner aus einer Zip-Datei entfernen

Erhält man von einem Mac-User eine Zip-Datei, enthält diese immer Dateien und Ordner welche unter Windows oder Linux keinen Zweck haben. So gibt es .DS_Store Dateien und einen __MACOSX Ordner. Diese Dateien sind normalerweise versteckt und werden je nach Einstellung angezeigt.

In den Dateien werden von MacOS Informationen zur Datei- und Ordnerstruktur sowie Datei-Icons gespeichert. Diese Dateien werden automatisch angelegt und können nicht wirklich gelöscht werden, da sie als Metadaten vom Betriebssystem unmittelbar danach wieder angelegt werden.

Die nachfolgende Anleitung bezieht sich auf das Entfernen unter Mac OS.

.DS_Store Dateien aus einem Zip-Archiv entfernen

Auf dem Mac das «Terminal» öffnen. Danach den folgenden Befehl eingeben.

zip -d /pfad/zur/zip-datei/DATEINAME.zip \*.DS_Store

Mit dem -d werden die angegebenen Dateien entfernt.

__MACOSX Ordner entfernen

Auch diese Ordner können über das Terminal in der Zip-Datei bereinigt werden

zip -d /pfad/zur/zip-datei/DATEINAME.zip "__MACOSX*" 

Beide Befehle kombinieren

Natürlich kann die Bereinigung auch mit einem Durchgang ausgeführt werden:

zip -d /pfad/zur/zip-datei/DATEINAME.zip "__MACOSX*" \*.DS_Store

Excel: Stundensummen korrekt zusammenrechnen

Beim addieren von mehr als 24h in Excel wird die Stundenzahl nicht mehr korrekt dargestellt, da nach 24h die Zeit in Tage und Stunden umgerechnet wird. Mit folgender Einstellung werden die Stunden korrekt dargestellt:

  1. Zellen formatieren
  2. Auf Rubrik «Benutzerdefiniert» klicken und folgenden Wert eingeben:
[hh]:mm

Im Beispiel des Printscreens ist die Stundenzahl einstellig sowie mit einem «h» am Schluss versehen.

Apple Mail – E-Mails können nicht gelöscht werden

In Apple Mail kann es vorkommen, dass ein E-Mail nicht gelöscht werden kann. Es erscheint jeweils die Meldung:

"Die Email "[Betreff]" konnte nicht in das Postfach "[Postfachname]" 
verschoben werden. Das angegebene Objekt wurde im Informationsspeicher 
nicht gefunden"

Das kann in IMAP oder Exchange Mailkonten vorkommen. Meistens passiert dies, wenn das E-Mail auf zwei Geräten gleichzeitig gelöscht wird. So wird das E-Mail z.B. zuerst auf dem Handy gelöscht und danach bevor die Lösung synchronisiert wurde, im Apple Mail gelöscht.

Dann erscheint das E-Mail wieder und lässt sich mit oben stehender Meldung nicht mehr löschen. Mit folgender Anleitung kann das E-Mail dennoch gelöscht werden:

  1. E-Mail in ein zweites Postfach verschieben
  2. E-Mail löschen

WordPress Rest-API schützen

Die aktuelle c’t 23.2020 widmet sich den Sicherheitslücken. Eine «Lücke» ist die Rest-API von WordPress. Die WordPress REST API ist eine Schnittstelle, mit der Entwickler von außerhalb der WordPress-Installation selbst auf WordPress zugreifen können. Der Zugriff erfolgt über JavaScript, d.h. es können damit interaktive Webseiten und Apps erstellt werden.

Die Rest-API wird über www.domain.tld/wp-json aufgerufen. Folgend ein paar Beispiele was man da alles abrufen kann:

  • /wp-json/wp/v2/media
  • /wp-json/wp/v2/pages
  • /wp-json/wp/v2/comments
  • /wp-json/wp/v2/users

Dies ist grundsätzlich nicht ein Problem. Allerdings können je nach Konstellation dadurch durchaus Daten ausgelesen werden, welche nicht für fremde Augen bestimmt sind. Nun gibt es verschiedene Plugins oder auch Snippets um die API zu deaktivieren:

add_filter( 'rest_authentication_errors', function( $result ) {   
   if ( ! empty( $result ) ) {
      return $result;
   }
   if ( ! is_user_logged_in() ) {
      return new WP_Error( '401', 'not allowed.', array('status' => 401) );
   }
   return $result;
});

Damit wird der Zugriff auf die IP auf eingeloggte User beschränkt. Nun ist das jedoch ein Problem. Setzt man z.B. das beliebte Plugin Contact Form 7 ein, kann ein Formular nur noch abgesendet werden, wenn der Webseitenbesucher auf der Seite angemeldet ist, da Contact Form 7 die Rest-API nutzt, um das Formular abzusenden.

Eine bessere Umsetzung zur Einschränkung der API ist folgender Ansatz, den ich in StackOverflow gefunden habe:

/*-----------------------------------------------------------------------------------*
/* Secure Rest API - Remove some endpoints for non logged in users * 
/*-----------------------------------------------------------------------------------*

function myplugin_removes_api_endpoints_for_not_logged_in() {
	if ( ! is_user_logged_in() ) {
		// Removes WordPress endpoints:
		remove_action( 'rest_api_init', 'create_initial_rest_routes', 99 );

		// Removes Woocommerce endpoints
		if ( function_exists('WC') )
			remove_action( 'rest_api_init', array( WC()->api, 'register_rest_routes' ), 10 );	
	}
} 
add_action('init', 'myplugin_removes_api_endpoints_for_not_logged_in');

In dieser Umsetzung wird nicht die gesamte API deaktiviert sondern die relevanten Daten von WordPress und Woocommerce entfernt, sofern der Webseitenbesucher nicht eingeloggt ist.

Excel: SUMMEWENNS mit Datumsbereich

Letzhin musste ich im Excel die Summe aller Beträge auf die einzelnen Monate des Jahres aufteilen. Mit der Formel SUMMEWENN können Summen mit einer einzelnen Bedingung z.B. einer Kategorie umgesetzt werden.
Brauchen wir nun die Summe aller Beträge des Monats Januar, kommen wir mit SUMMEWENNS ans Ziel, welche aus mehreren Bedingungen aus einer «Nebenzelle» bestehen kann:

=SUMMEWENNS(B:B;A:A;">=" & DATUM(2020;1;1);A:A;"<=" & DATUM(2020;1;30))

Somit summieren wir alle Werte der Spalte B, deren „Nebenzelle“ in A größer gleich ist als der 1.1.2020 UND kleiner gleich dem 30.1.2020.

Beim kopieren der Formel ins Excel müssen allenfalls die Anführungszeichen in der Formel neu geschrieben werden.

Anstelle eines fixen Datums kann auch der Verzweis zu einer Zelle verwendet werden:

=SUMMEWENNS(B:B;A:A;">=" &D3;A:A;"<=" &E3)

In diesem Beispiel ist das Startdatum in der Zelle D3 und das Enddatum in der Zelle E3.

Es können auch weitere Kriterien hinzugefügt werden. So können z.B. auch nur Datensätze gezählt werden welche innerhalb eines Datumsbereichs liegen und einem weiteren Kriterium entsprechen:

=SUMMEWENNS(C:C;A:A;">="&DATUM(2022;1;1);A:A;"<="&DATUM(2022;12;31);B:B;"="&"Lebensmittel")

In diesem Beispiel muss der Datumsbereich innerhalb des Jahres 2022 liegen sowie dem Kriterium «Lebensmittel» entsprechen.

Wichtig: Das Feld in welchem das Datum steht, muss auch als Datum formatiert sein. Ich habe auch schon Beispiele gesehen in denen '01.01.2022 stand. Das Datum hatte in Hochkomma vorgesetzt. Damit funktioniert es natürlich nicht, da ein solches Datum ungültig ist.