Bash: lsup zur Anzeige der Dateiberechtigungen
Wie oft ich das schon im Linux Filesystem gebraucht habe: in einem aktuellen oder angegebenen Verzeichnis prüfen, ob der Linux-Benutzer XY bis dorthin “durchkommt” und Berechtigungen in einem Verzeichnis oder auf eine Datei hat.
Also schrieb ich ein Shellskript. Man ruft es mit einem Parameter für ein zu prüfendes Verzeichnisses auf. Oder ohne Parameter für das aktuelle Verzeichnis.
Ich fange mal mit dessen Ausgabe an:
$ lsup drwxr-xr-x 1 root root 244 Apr 2 23:34 / drwxr-xr-x 1 root root 100 Jun 4 2022 /home drwx------ 1 axel autologin 1.7K May 25 18:17 /home/axel drwxr-xr-x 1 axel autologin 232 May 25 19:50 /home/axel/tmp
Ab dem Root-Verzeichnis werden mit ls -ld alle Verzeichnisebenen bis zum angegebenen Punkt angezeigt.
Syntax:
$ lsup -h ===== LSUP v1.3 :: make an ls upwards ... ===== Show directory permissions above by walking from / to the given file. You can add no or one or multiple files as params. SYNTAX: lsup Walk up from current directory lsup FILE [FILE N] Walk up from given file/ directory If the target is relative it will walk up to the current directory lsup -h Show this help and exit EXAMPLES: lsup lsup . lsup /var/log/ lsup my/relative/file.txt lsup /home /tmp /var
Zur Installation: als User root;: cd /usr/bin/ und nachfolgenden Code in eine Datei namens “lsup” werfen und ein chmod 0755 lsup hinterher.
#!/usr/bin/env bash # ====================================================================== # # Make an ls -d from root (/) to given dir to see directory # permissions above # # ---------------------------------------------------------------------- # 2020-12-01 v1.0 Axel Hahn # 2023-02-06 v1.1 Axel Hahn handle dirs with spaces # 2023-02-10 v1.2 Axel Hahn handle unlimited spaces # 2023-03-25 v1.3 Axel Hahn fix relative files; support multiple files # ====================================================================== _version=1.3 # ---------------------------------------------------------------------- # FUNCTIONS # ---------------------------------------------------------------------- function help(){ local self=$( basename $0 ) cat <<EOH ===== LSUP v$_version :: make an ls upwards ... ===== Show directory permissions above by walking from / to the given file. You can add no or one or multiple files as params. SYNTAX: $self Walk up from current directory $self FILE [FILE N] Walk up from given file/ directory If the target is relative it will walk up to the current directory $self -h Show this help and exit EXAMPLES: $self $self . $self /var/log/ $self my/relative/file.txt $self /home /tmp /var EOH } # ---------------------------------------------------------------------- # MAIN # ---------------------------------------------------------------------- if [ "$1" = "-h" ]; then help exit 0 fi test -z "$1" && "$0" "$( pwd )" # loop over all given params while [ $# -gt 0 ]; do # param 1 with trailing slash mydir="${1%/}" if ! echo "$mydir" | grep "^/" >/dev/null; then mydir="$( pwd )/$mydir" fi ls -ld "$mydir" >/dev/null 2>&1 || echo "ERROR: File or directory does not exist: $mydir" ls -ld "$mydir" >/dev/null 2>/dev/null || exit 1 mypath= arraylist=() arraylist+=('/') IFS="/" read -ra aFields <<< "$mydir" typeset -i iDepth=${#aFields[@]}-1 for iCounter in $( seq 1 ${iDepth}) do mypath+="/${aFields[$iCounter]}" arraylist+=( "${mypath}" ) done # echo ">>>>> $mypath" eval "ls -lhd ${arraylist[*]}" shift 1 test $# -gt 0 && echo done # ----------------------------------------------------------------------
Viel Spass damit!
Fontawesome Upgrade von Version 5 auf Version 6
Um Fontawesome von Version 5 auf 6 zu aktualisieren, gibt es einen Upgrade-Guide [1].
Aber das ist viel zu kompliziert :-)
nachdem ich einige Web-projekte umgestellt habe (das Intranet unseres Instituts, IML Appmonitor, ahCrawler, Pimped Apache Status) kann ich meinen Ansatz präsentieren:
- Man entferne das eingebundene CSS File von Fontawesome 5 und ersetze es durch das der Version 6, z.B.:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" integrity="sha512-iecdLmaskl7CVkqkXNQ/ZH/XLlvWZOJyj7Yy7tcenmpD1ypASozpmT/E0iPtmFIB46ZmdtAc9eNBvH0H/ZpiBw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
- Die meisten Icons sollten nach wie vor da sein. Aber wir aktualisieren einmal die Schreibweise der CSS Klassen für die Version 6.
- im Projektordner Suchen und Ersetzen “fas fa” –> “fa-solid fa”
- im Projektordner Suchen und Ersetzen “far fa” –> “fa-regular fa”
Damit sind 98% erledigt. Nun sollte man die Webseite nochmal genau anschauen. Es kann sein, dass es noch das ein oder andere Prefix umzustellen gilt (z.B. für Brands). Oder aber es gibt auch einige (wenige) Icons, die nun anders heissen - wenngleich sich diese vielleicht nur schwer finden lassen - für diese muss man in [2] die neue Schreibweise ermitteln.
Viel Glück bei der Umstellung!
Weiterführende Links:
Pimped Apache Status - PHP 8.2 kompatibel
Der Pimped Apachestatus ist ein Webtool, dass die etwas schwer verdauliche Apache Serverstatus Page aufbereitet. Es gibt verschiedene Ansichten, sortier- und filterbare Tabellen und Graphen. Das ganze funktioniert nicht nur für einen einzelnen Server, sondern auch für mehrere Webhosts, z.B loadbalante Webeiten.
Am Wochenende gab es ein Update, in dem einige Vendor-Bibliotheken aktualisiert wurden.
Da die als kompatibel bestätigte Version 8.0 alsbald ausläuft, wurde es mit neueren PHP Versionen getestet. Es ist nunmehr PHP 8.2 kompatibel.
Zum Aktualisieren meldet sich der Updater. Bei Installationen mit git bitte git pull verwenden.
Weiterführende Links:
Bash-Skript - einfaches Multi-Ping-Monitoring in Fast-Echtzeit
Ich brauchte da auf die Schnelle mal was: ich wollte mehrere Systeme mit Ping antesten, ob sie im Netz sind.
Die Liste der zu testenden Systeme sollte untereinander stehen und pro System angeben; ich bin erreichbar … oder auch nicht.
Ja natürlich haben wir ein System-Monitoring, aber das ist etwas träge - ich wollte das Ganze alle wenige Sekunden aktualisieren. Im Rack wollte ich Kabel ziehen und umstecken - und nebenher sehen, welches Gerät offline geht und wieder da ist.
Hier mein Bash-Skript:
#!/bin/bash cfgfile="$0.cfg" while true; do clear echo ">>>>> PING TEST :: $( date )" echo cat "$cfgfile" | grep "^[a-z1-9]" | while read -r target do printf "%-35s > " $target if ! ping -c1 $target 2>&1 | grep "transmitted"; then echo "FAILED" fi done sleep 1 done
Im Endlos-Loop wird der Bildschirm gelöscht, ein Header mit Datum ausgegeben. Ich lese eine Datei aus, die meine Liste von Geräten enthält.
Ein Gerät wird einmalig angepingt (Parameter -c 1) - genau das geht sehr schnell. Es wird ausgegeben, ob es erreichbar war oder nicht.
Nach Abarbeiten der Liste folgt ein sleep 1 - und nach dieser nur kurzen Wartezeit geht es von vorn los.
Die Configdatei mit der Liste der Server - je einer pro Zeile - Leerzeilen, Kommentare u.ä werden ignoriert:
# # my server list # server-01.example.com server-02.example.com server-03.example.com server-04.example.com server-05.example.com
Das Ganze sieht in der Ausgabe am Terminal grob aus:
>>>>> PING TEST :: Mi 10 Mai 2023 16:37:41 CEST server-01.example.com > 1 packets transmitted, 1 received, 0% packet loss, time 0ms server-02.example.com > 1 packets transmitted, 1 received, 0% packet loss, time 0ms server-03.example.com > 1 packets transmitted, 1 received, 0% packet loss, time 0ms server-04.example.com > 1 packets transmitted, 1 received, 0% packet loss, time 0ms server-05.example.com > FAILED
A Touch Of Glass - Update
Das war ja ärgerlich: die Loginseite erschien nicht mehr. Ich hatte es nicht bemerkt, weil mein Login gespeichert war und ich mich nicht mehr interaktiv eingeloggt habe.
Ich hatte zuletzt in den (Smarty) Templates alle Includes mit Hochkommas versehen.
{include file='widgets.tpl'}
Dummerweise auch in der defaults.tpl, wo eine Variable drin war - das hier hingegen funktioniert natürlich nicht:
{include file='$content'}
Die Hochkomma müssen bei Variablen weg. Das wurde nun korrigiert.
Weiterführende Links: