Seite wählen

NETWAYS Blog

Einsamkeit im Home Office. Ein Ansatz dagegen

“Man kann keine sozialen Probleme mit technischen Mitteln lösen” hört man manchmal. Naja, als IT-Nerds können wir’s wenigstens mal versuchen. Ich werd’ Dir jetzt nicht erzählen, dass wir gerade mitten in einer Pandemie stecken und man sich am besten von anderen Menschen fernhält. Falls Du das nicht glaubst, bist Du hier eh falsch. Da NETWAYS die Lage ernst nimmt und möglichst umfassendes Home Office ermöglicht bzw. fördert, sitzen viele von uns jetzt noch mehr zu Hause als sonst auch schon. Schon recht bald haben wir akzeptiert, dass das noch länger so bleiben wird und die Einsamkeit im Home Office uns einholen wird. Also haben wir begonnen, nach Lösungen zu suchen.

Eine kurze Vorgeschichte

Dass die NETWAYS Family großen Wert auf Zusammenhalt legt, sollte allen, die uns kennen klar sein. Deshalb gibt’s auch regelmäßig die “Startup-Days”. Davon wurde hier schon berichtet, deshalb nur die Kurzfassung: Alle können Vorschläge für Projekte einreichen und aus der ganzen Gruppe finden sich Teams zusammen, die daran arbeiten. So ergibt es sich, dass man mal mit Leuten gemeinsam eine Aufgabe angehen kann, mit denen man sonst nur selten Berührung hat. Ganz nebenbei fallen dabei auch immer einige Projekte raus, die weiterverfolgt werden und unser aller Leben bereichern

Aus gegebenem Anlass hab’ ich dann vorgeschlagen, wir könnten doch nach Ansätzen suchen, um die Einsamkeit im Home Office möglichst zu minimieren. Dabei ist der Begriff “Einsamkeit” so weit wie möglich gefasst. Damit ist nicht nur gemeint, dass man all jenen hilft, die alleine wohnen und so gar niemand zum Unterhalten außerhalb vom Job haben. Auch einfach um zu verhindern, dass man die anderen lieben Leute von NETWAYS zu sehr vermisst oder neu hinzu Gekommenen den Einstieg zu erleichtern, sollte die Lösung beitragen.

Außerhalb von Pandemie-Zeiten gab’s am Montag immer ein umfassendes Standup, bei dem alle sich im Kreis aufgestellt und der Reihe nach einen kurzen Überblick über die Pläne für die aktuelle Woche gegeben haben. Weil unser Bernd ein optimistischer Mensch ist, hat er den Termin auch gleich mal im Kalender von allen gelassen – nur wurde der eben nicht mehr wahrgenommen. Der Termin, nicht der Bernd.

Arbeitsgruppe gegen Einsamkeit im Home Office

Der Vorschlag, da etwas zu unternehmen, fand einigen Anklang und bald war auch eine kleine Gruppe beisammen, um sich auf die Suche nach der Lösung zu machen. Wie’s so ist mit weltumfassenden Problemen, dafür braucht sogar ein Spezialist:innenteam der NETWAYS mehr als 2 Tage, weshalb wir die Ziele bald mal etwas reduziert haben. Nach einem umfassenden Gehirnstürmen haben wir uns entschieden, erstmal mit einem Chatbot für unseren Rocket.Chat anzufangen, der die Einsamkeit im Home Office bekämpfen soll. Chatbot – echt jetzt? Ja, Chatbot.

Warum jetzt echt ein Chatbot? Weil wir etwas ausnutzen wollten, das man häufig erlebt, wenn gute Menschen unter Belastung stehen: Alle wissen, dass es Dinge gibt, die man tun könnte, die helfen könnten, viele planen, sie auch umzusetzen und fast alle sind dann doch zu eingespannt oder zu erschöpft um neben Arbeit und Alltag auch noch Gutes für sich und andere zu tun. Wenn aber jemand kommt und diese Menschen anstubst, dann raffen sich doch einige auf und gehen’s an. Es wird immer die geben, die sagen “Jo, eh” und es dann einfach lassen, aber das muss auch mal ok sein. Das Ziel war nicht, alle zu etwas zu zwingen, sondern einfach das bisserl mehr Antrieb zu liefern, um es dann doch mal anzugehen.

Eine der ersten Funktionen des Chatbot war dann auch, in zufälligen Abständen zufällige Menschen in der Firma anzuschreiben und einen Vorschlag für eine gute Tat gegen Einsamkeit im Home Office zu unterbreiten. Explizit ohne Auswertung, ohne Fingerzeigen, ohne Zwang. Wer kann, macht, wer nicht, schafft’s vielleicht beim nächsten Mal. Das können so Dinge sein wie “Schlag doch mal ein kleines soziales Projekt vor” (Yeah, Singularität in sozialen Projekten), “Schreib eine handschriftliche Grußkarte an $KOLLEG”, “Frag doch mal $KOLLEG wie’s gerade so läuft”. Um es kurz zu machen: Diese Funktionalität ist aktuell nicht aktiv. Aktuell wird nämlich eine andere verfeinert. Dazu gleich mehr.

Standup für alle aber nur mit wenigen

Was tun wir jetzt konkret? Der Chatbot generiert zu dem Zeitpunkt, an dem üblicherweise das NETWAYS weite Standup stattfindet einige Meetingräume im Jitsi, würfelt dann genau so viele Gruppen von Leuten zusammen und schickt allen den jeweiligen Link. So sind immer ein paar Leute gemeinsam in einer Jitsi-Session. Egal aus welchem Bereich von NETWAYS (oder Icinga). Da es immer nur eine handvoll Menschen sind, bleibt für alle genug Zeit, mal ein bissl was zu erzählen. So sieht man sich wieder, kann mal ein paar Worte wechseln und verliert sich nicht ganz aus den Augen.

Um den Vorschlag von vorhin wieder aufzugreifen schickt der Bot manchmal einzelnen Teilnehmer:innen einen Vorschlag mit, worüber man reden könnte. z.B. “Erzähl von dem, was Du diese Woche vorhast” oder “Schlag ein kleines soziales Projekt vor”.

Wo viele Menschen zusammenkommen, menschelt’s und was zu erwarten war, ist gleich mal eingetreten. Die ersten waren zu beschäftigt oder was auch immer, um sich vom Chatbot ablenken zu lassen. Deshalb wurde auch gleich mal eine Blockliste eingeführt, auf dass manche nicht mehr behelligt werden. Der Bernd in seiner Weisheit weiß allerdings, dass es manchmal doch möglich und nötig ist, jemandem zum Glück zu zwingen und hat die wieder entfernen lassen. (Die Blocklist, um Missverständnissen vorzubeugen) In der Zwischenzeit hört man nix negatives mehr und ich geh mal davon aus, dass jetzt alle doch ganz froh sind, dass sie mal wieder mit den anderen Kontakt haben. Ok, als der Bot die Zeitumstellung verpennt hat, gab’s ein paar Sticheleien. Aber hey, so merkt man wenigstens, dass alle schon drauf warten, in die Standup-Runde eingeladen zu werden, um etwas weniger Einsamkeit im Home Office zu erleben.

Thomas Widhalm
Thomas Widhalm
Lead Support Engineer

Thomas war Systemadministrator an einer österreichischen Universität und da besonders für Linux und Unix zuständig. Seit 2013 möchte er aber lieber die große weite Welt sehen und hat sich deshalb dem NETWAYS Consulting Team angeschlossen. Er möchte ausserdem möglichst weit verbreiten, wie und wie einfach man persönliche Kommunikation sicher verschlüsseln kann, damit nicht dauernd über fehlenden Datenschutz gejammert, sondern endlich was dagegen unternommen wird. Mittlerweile wird er zum logstash - Guy bei NETWAYS und hält...

ZFS Cheat Sheet

Wenn man sich mit einem eigenen Linux Storage Servers beschäftigt hat man sicher schon davon gehört: ZFS. Ich beschäftige mich schon seit längerem mit ZFS und bin an einem Punkt an dem ich mir die Menge der Kommandos nicht mehr merken kann. Zu ZFS findet man zwar schon sehr viel im Internet, die Themen Snapshots oder verschlüsselte ZFS-Datasets fehlt aber leider meistens oder die Informationen sind nicht gesammelt an einer Stelle zu finden. Damit ich in Zukunft nicht immer suchen muss und Ihr auch etwas davon habt, schreibe ich hier alles zusammen.

Installation von ZFS unter Debian / Ubuntu
Die Installation wurde unter Debian 10 (Buster) und Ubuntu Server 20.10 (Groovy Gorilla) durchgeführt. Das Einbinden des Backports Repos ist für Ubuntu Server 20.10 nicht notwendig.
# apt-get update
# apt-get upgrade

# vi /etc/apt/sources.list.d/buster-backports.list
deb http://deb.debian.org/debian buster-backports main contrib
deb-src http://deb.debian.org/debian buster-backports main contrib

# vi /etc/apt/preferences.d/90_zfs
Package: libnvpair1linux libuutil1linux libzfs2linux libzpool2linux spl-dkms zfs-dkms zfs-test zfsutils-linux zfsutils-linux-dev zfs-zed
Pin: release n=buster-backports
Pin-Priority: 990

# apt-get update
# apt-get upgrade

--> Reboot (falls es ein Kernelupgrade gab)

# apt install dpkg-dev linux-headers-$(uname -r) linux-image-amd64
# apt install zfs-dkms zfsutils-linux

Erstellen eines einfachen ZFS Storage Pools
Mit folgendem Kommando wird ein ZFS Storage Pool namens “data” erstellt. Dank “raidz1” wird eine Redundanz aufgebaut und eine Festplatte kann ohne Probleme ausfallen. Es ist unter anderem auch möglich “raidz2” oder “raidz3” zu definieren.
# zpool create data raidz1 sdb sdc sdd
# zpool status

Erstellen eines ZFS Storage Pools mit Partition UUIDs
# ls -la /dev/disk/by-partuuid/
# zpool create data raidz1 00b85ce9-a0d5-9340-b347-cd0bcc714dc0 04c20b90-5678-4b88-af49-21db76427eda 0c35cb57-5bc6-7c49-929f-466102c22d05

Erstellen eines ZFS Datasets
# zfs create data/playground

Erstellen eines verschlüsselten ZFS Datasets
# zfs create -o encryption=aes-256-gcm -o keyformat=passphrase data/playground
# zfs get encryption

Erstellen eines ZFS Snapshots
# zfs snapshot data/playground@`date +%Y-%m-%d_%H-%M-%S`

Löschen eines ZFS Snapshots:
# zfs destroy data/playground@2020-09-12_17-25-42

Durchsuchen von Snapshots (z. B. zum Restore einzelner Daten)
# cd /data/playground/.zfs/snapshot/2020-09-12_17-25-42
# ls -la

Hinzufügen eines SSD-Caches
Erzeugen des Dateisystems auf der Partition:
# zpool create -f log  /dev/sde1
# zpool create -f cache  /dev/sde2

Löschen des Dateisystems:
# zpool destroy log1
# zpool destroy cache1

Hinzufügen von Cache und Log zum ZFS Pool:
# zpool add data log /dev/sde1
# zpool add data cache /dev/sde2

Vorsicht: In diesem Beispiel ist der Cache nicht gespiegelt / abgesichert! Beim Ausfall der SSD wären die Daten im Cache verloren!

Anzeigen der Speicherbelegung über den ganzen ZFS Pool inkl. Snapshots
# zpool set listsnapshots=on data
# zfs list -o space -r data

Tobias Redel
Tobias Redel
Head of Professional Services

Tobias hat nach seiner Ausbildung als Fachinformatiker bei der Deutschen Telekom bei T-Systems gearbeitet. Seit August 2008 ist er bei NETWAYS, wo er in der Consulting-Truppe unsere Kunden in Sachen Open Source, Monitoring und Systems Management unterstützt. Insgeheim führt er jedoch ein Doppelleben als Travel-Hacker, arbeitet an seiner dritten Millionen Euro (aus den ersten beiden ist nix geworden) und versucht die Weltherrschaft an sich zu reißen.

Pimp your DNS!

Bei einem Consultingkunden hatte ich eine interessante Aufgabenstellung zu lösen: “Jedes Mal wenn die Domänencontroller geplant nacheinander durchgestartet werden führt das dazu, dass die Hosts im Monitoring (Icinga) kurzzeitig nicht erreichbar sind”. Auf die Frage warum die Domänencontroller regelmäßig durchgestartet werden möchte ich übrigens nicht näher eingehen 😉

Nach etwas Recherche hat sich dann herausgestellt dass das Problem aller Wahrscheinlichkeit nach am DNS liegt. Dazu sollte man wissen das die DNS-Auflösung über das sog. Resolver Configuration File die Datei “/etc/resolv.conf” bei mehreren Einträgen sequenziell läuft. D.h. das immer versucht wird über den zuerst eingetragen Nameserver aufzulösen, sollte das nicht funktionieren wird nach Erreichen des Timeouts (standardmäßig 5s) der nächste Eintrag probiert usw.

Was also tun? Den herkömmlichen Mechanismus zur DNS-Auflösung einfach ersetzen! Eine elegante und einfach zu installierende Alternative ist dnsmasq. Das Tool bietet zwar noch ein paar weitere Möglichkeiten, in meinem Fall reicht es aber schon aus das dnsmasq die Nameserver parallel befrägt (all-servers) und den nimmt, der am schnellsten antwortet. Am Beispiel von CentOS 7 lässt sich dnsmasq als Plugin über den Network Manager aktivieren. Dazu hinterlegen wir zuerst einmal die Hauptkonfiguration von dnsmasq in der Datei “/etc/NetworkManager/dnsmasq.d/dnsmasq.conf”:

resolv-file=/etc/resolv.dnsmasq
all-servers
interface=lo
bind-interfaces
cache-size=0

Danach übertragen wir die beispielhaften Nameserver aus “/etc/resolv.conf” nach “/etc/resolv.dnsmasq”:

nameserver 8.8.8.8
nameserver 8.8.4.4

Ist das passiert können wir im Network Manager über “/etc/NetworkManager/conf.d/dns.conf den DNS-Modus ändern:

[main]
dns=dnsmasq

Noch kurz den Network Manager neu laden:

systemctl reload NetworkManager.service

Und schon kommen wir in den Genuss der Auflösung via dnsmasq. Dabei ist zu beachten das der Network Manager die bisherigen Namerserver-Einträge in der “/etc/resolv.conf” entfernt und gegen lediglich einen Eintrag auf “127.0.0.1” ersetzt hat.

Beim betroffenen Kunden funktioniert die Lösung mit dnsmasq seit einigen Monaten zuverlässig und das auch wenn die Domänencontroller mal wieder durchgestartet werden. Und natürlich würde es mich freuen wenn wir auch Ihr Problem lösen können!

Markus Waldmüller
Markus Waldmüller
Lead Senior Consultant

Markus war bereits mehrere Jahre als Sysadmin in Neumarkt i.d.OPf. und Regensburg tätig. Nach Technikerschule und Selbständigkeit ist er nun Anfang 2013 bei NETWAYS als Lead Senior Consultant gelandet. Wenn er nicht gerade die Welt bereist, ist der sportbegeisterte Neumarkter mit an Sicherheit grenzender Wahrscheinlichkeit auf dem Mountainbike oder am Baggersee zu finden.

Redis Eviction Policies

After install Redis you don’t have any settings configured to control memory consumption. In Production this brings OOM to the arena which leads into a broken applications.

First thingy what users do is to configure MaxMemory config setting (like me of course ;-)). In combination with a noeviction policy (which is also the default) the documentation says:

[…] return errors when the memory limit was reached and the client is trying to execute commands that could result in more memory to be used (most write commands, but DEL and a few more exceptions).

The bad news is, you’ll have a broken application again. Most web apps just use Redis as an uncontrolled cache data sink and left over to you how to handle it. For 99.9% of the use-cases you just need to configure a cache policy, or in Redis-speech, an Eviction Policy, which means:

maxmemory 128mb
maxmemory-policy allkeys-lru
maxmemory-samples 10

1. You allow roughly 128MB of memory for Redis
2. Redis tries to remove the less recently used (LRU) keys first
3. Because LRU is not a exact LRU algo, you use 10 samples to help the algorithm to find the items

Try to explain by counters:

Icinga Redis Plugin Output:

Above is a icinga redis check plugin output. Which shows a roundabout memory use of 108% – which is more than the configured 128M 100% base.

Grafana Graph (Telegraf Redis Input Plugin)

Here is the config change made on the 02/04 down to 128M MaxMemory and the LRU Eviction Policy. The memory footprint stays the same. The change is more granular if you zoom in:

If the allkeys-lru does not work for you, give the documentation a try. There is a lot you can do to keep your applications up and running and make Redis a fluently easy dependency.

Marius Hein
Marius Hein
Head of ITSM

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Administrators Toolbox: Die Zsh

Einfuehrung

Zu jeder stereotypischen Hacking-Szene in einem Film oder einer Serie gehoert das Terminal in dem kryptische Ausdruecke, Befehle oder Programmcode ueber den Bildschirm huschen. Je nach Ausfuehrung ist das unterschiedlich laecherlich, aber nichtsdestotrotz ist das Terminal seit seiner Einfuehrung als Nutzerinterface eine der wichtigsten Schnittstellen zwischen Mensch und Maschine geblieben. Entstanden aus dem Wunsch und der Notwendigkeit mit einem Programm zur Laufzeit zu interagieren, war es ein langer Weg von den umfunktionierten elektrischen Schreibmaschinen (Teletype) ueber 80×25 Zeichen Monochrom-Roehrenmonitore (wahlweise in gruen oder orange) bis hin zu einem Terminal-Emulator als ein weiteres Fenster in der graphischen Oberflaeche.

Dialogisch mit dem System zu interagieren und mit vergleichsweise kleinen Anforderungen beliebig komplexe Prozesse anzustossen eroeffnen einem viele Moeglichkeiten und, nach Meinung des Autors, sind in vielen Anwendungen noch keine Alternativen in Sicht, die es besser machen wuerden. Mit Text als menschenverstaendliche Schnittstelle dient dienen Shell als eine Abstraktionshuelle fuer das Betriebssystem und andere Anwendungen, die einem zumindest auf Unix-aehnlichen Systemen noch sehr haeufig begegnet.

Der haeufig anzutreffende Platzhirsch in dem Feld der Shells ist die bash, die Bourne again shell, zumindest auf vielen gaengigen Linux-Distributionen und ist als solides und maechtiges Werkzeug bekannt. An manchen Stellen lassen sich jedoch ein paar Schwaechen finden und manchmal ein gewisser Komfort vermissen, gerade bei der Interaktion mit dem eigenen Desktop-System, deshalb wird hier eine Alternative thematisiert, die Z shell (kurz zsh). Die Geschichte, der Code und tiefere technische Details sollen hier nicht im Zentrum stehen, eher die konkrete Nutzung und einzelne Features.

Installation

Wie die Installation auf dem jeweiligen System verlaeuft haeng natuerlich von der Umgebung ab, auf Linux duerfte der jeweilige Packetmanager diesem Zweck dienen, hier reicht ein apt-get install zsh, aber your mileage may vary. Im Zweifelsfall kann man die entsprechenden Dateien auf der offiziellen Seite finden.

Konfiguration

Der wichtigste Teil an der Benutzung der zsh duerfte die Konfiguration sein, da sich eine Unmenge von Parametern veraendern lassen und viele der Features aktiviert/konfiguriert werden muessen. Fuer die Ungeduldigen gibt es eine Beispielkonfiguration, die im Folgenden Schritt fuer Schritt nachvollzogen wird. Ansonsten kann die zsh auch ohne Konfiguration gestartet werden, sie wird den Benutzer auf diesen Fakt hinweisen und Empfehlungen bezueglich des weiteren Vorgehens liefern. Auch liefern Distribution typischerweise eine Basiskonfiguration mit und die Suchmaschine der persoenlichen Wahl duerfte schnell ein Vielzahl von weiteren Beispielen und Anleitungen bieten. Am Ende dieses Beitrags sind auch noch einige Links als Startpunkt beigefuegt. Natuerlich sind auch die man-pages ein sinnvoller Anlaufpunkt.

Keybindings/Tastenkombination

# Use Vi(m) style key bindings.
bindkey -v

Die ist eine sehr minimale Konfiguration und weist die zsh an, vim-artige Tastenkombination zu verwenden. Dies ist eher minimal, Aktionen zur Navigation innerhalb der Eingabezeile und vieles mehr koennten hier konfiguriert werden.

Prompt

Die Prompt (also der Text, der vor jeder Eingabezeile steht) kann gut zur Darstellung von nuetzlichen Informationen genuetzt werden oder sollte mindestens huebsch sein.

[[ "$COLORTERM" == (24bit|truecolor) || "${terminfo[colors]}" -eq '16777216' ]] || zmodload zsh/nearcolor
autoload -Uz colors && colors

Zuerst wird versucht die Faehigkeiten des Terminal bezueglich der Darstellung von Farben zu bestimmen und die entsprechenden Module geladen

autoload -Uz promptsubst
autoload -Uz promptinit && promptinit
autoload -Uz vcs_info

Einige weitere Module, die die Personalisierung der Prompt ermoeglichen.

# Define the theme
prompt_mytheme_setup() {
local user
if [[ $USER == "root" ]] then
user="%F{9}%n"
else
user="%F{12}%n"
fi
if [[ ! -z $SSH_CLIENT ]] then
user="%F{3}SSH -> $user"
fi

Hier wird ein eigenes Theme begonnen, dass einen normalen Nutzer in einer Farbe darstellt und den Nutzer “root” in einer anderen.
Zusaetzlich wird angezeigt, ob man ueber SSH verbunden ist.

# Information about version control systems
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes yes
zstyle ':vcs_info:*' use-prompt-escapes yes
zstyle ':vcs_info:*' formats "%s - (%r|%b)" "%u%c"
local prefix="%(?..[%?%1v] )"
local vcs="%(2v.%U%2v%u.)"
PROMPT="%K{0}%F{9}$prefix%f%B$user@%M%f %F{7}%/%b%f%k
%B#%b %E"
RPROMPT="%K{0}%F{9}$vcs%f%k"
add-zsh-hook precmd prompt_mytheme_precmd
}

Die Prompt wird zusammengesetzt und um Information ueber git-Repositories ergaenzt, falls das aktuelle Arbeitsverzeichnis sich in einem solchen befindet.

prompt_mytheme_precmd () {
setopt noxtrace noksharrays localoptions
local exitstatus=$?
local git_dir git_ref
psvar=()
[[ $exitstatus -ge 128 ]] && psvar[1]=" $signals[$exitstatus-127]" || psvar[1]=""
vcs_info
[[ -n $vcs_info_msg_0_ ]] && psvar[2]="$vcs_info_msg_0_"
}

Vor jeder Promptdarstellung wird der EXITSTATUS des vorherigen Programms ueberprueft und angezeigt, falls dieser !=0 (Fehler) ist.

# Add the theme to promptsys
prompt_themes+=( mytheme )
# Load the theme
prompt mytheme

Die Prompt wird geladen.

Noch einige Optionen

setopt nobeep
Deaktiviere die Terminal-“Glocke”.

setopt autocd
Die Eingabe eines Verzeichnisnamens wird als “cd $VERZEICHNIS” interpretiert.

# Prevent overwriting existing files with '> filename', use '>| filename'
# (or >!) instead.
setopt noclobber

Verhindere versehentliches Ueberschreiben von Dateien durch Redirection.

# Enable zsh's extended glob abilities.
setopt extendedglob

Erweitertes globbing.

setopt longlistjobs
Bei der Ausgabe von jobs wird die PID mit angezeigt

Autovervollstaendigung

## Initialize completion
autoload -Uz compinit && compinit

# Automatically list choices on an ambiguous completion.
setopt autolist
## show list of tab-completing options
zstyle ':completion:*:default' list-prompt '%p'
## cache completion for re-use (path must exist)
zstyle ':completion:*' use-cache yes; zstyle ':completion:*' cache-path
## _complete -> completiong
## _expand -> expand variables
## _prefix -> ignore everything behind cursor
## _approximate -> fuzzy completion
## _ignore -> ignore some matches (i.e. directories when doing cd)
zstyle ':completion:::::' completer _expand _complete _prefix _ignored _approximate
## one wrong character every X characters is corrected
## X = 5 is a reasonable default
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX + $#SUFFIX) / 5 )) )'
## correct lowercase to uppercase
zstyle ':completion:*:(^approximate):*' matcher-list 'm:{a-z}={A-Z}' # Kleinschreibung automatisch zu Grossschreibung korrigieren.
## keep magic prefixes like '~' when expanding
zstyle ':completion:*:expand:*' keep-prefix yes
## compelte a/b/c zu abc/bcd/coo
zstyle ':completion:*' list-suffixes yes
## colors in completion menu ##
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
# allow autocomplete-navigation with arrowkeys
zstyle ':completion:*' menu select #enable a menu which can be browsed with arrow keys
# tab completion after pressing tab once (default is twice)
setopt nolistambiguous
# allow in word completion
setopt completeinword

Diverse Einstellungen zur Autovervollstaendigung, unter anderem die Darstellung der validen Optionen und Vervollstaendigung in Woertern.

History/Geschichte

Gerade bei der Historie ist der Nutzen der zsh am deutlichsten, so koennen Befehle ohne grosse Umwege direkt nach Eingabe in die Historie geschrieben werden, ohne dass grosse Umwege beschrieben werden wie es bei der bash normalerweise noetig waeren.

# write command to historyfile imediatelly
setopt appendhistory
setopt incappendhistory
## max size and location of history-savefile
STSIZE=20000
SAVEHIST=20000
if [[ ! -a ~/logs ]] {
mkdir ~/logs
}
HISTFILE=~/logs/zshhistory.log
## no duplicated commands
setopt histignoredups
## no emptylines
setopt histignorespace
# Fancy search for history. Install peco
if ! [ -x "$(command -v peco)" ]; then
bindkey '^R' history-incremental-pattern-search-backward
else
## bind peco to ctrl-R as a better reverse search than the buitin if it is available
reverse_search(){print -z "$(tac ${HISTFILE} | peco)"}
zle -N rs_peco reverse_search
bindkey "^R" rs_peco
PECO=/usr/bin/
fi

Zusaetzlich wird hier das Programm peco fuer die Suche in der Historie verwendet (falls vorhanden). Dies stellt die passenden Eintraege sehr schnell und sichbar dar.

Gemischtes

umask 077
Stellt die umask sehr restriktiv ein. Dateien muessen dann erst fuer andere lesbar gemacht werden.

LS_COLORS=$LS_COLORS:'di=0;35:'; export LS_COLORS
Farbschemata fuer ls.

if [[ -f ~/.config/zsh/aliases ]]; then
source ~/.config/zsh/aliases
fi

Lese Aliase aus der Datei ~/.config/zsh/aliases, falls vorhanden.

export EDITOR=nvim
Setze neovim als Standart-Editor fuer die Umgebung.

if [[ -d ~/scripts ]] {
export PATH=$PATH:~/scripts
}

In ~/scripts sind selbst erstellte Skripte des Nutzers und werden hiermit direkt nutzbar.

man() {
env \
LESS_TERMCAP_mb=$(printf "\e[1;31m") \
LESS_TERMCAP_md=$(printf "\e[1;31m") \
LESS_TERMCAP_me=$(printf "\e[0m") \
LESS_TERMCAP_se=$(printf "\e[0m") \
LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
LESS_TERMCAP_ue=$(printf "\e[0m") \
LESS_TERMCAP_us=$(printf "\e[1;32m") \
man "$@"
}

Dies faerbt man-pages ein und macht sie dadurch leichter lesbar.

Aliase

Aliase sind frei konfigurierbare “Pseudokommandos” die durch die zsh ausgewertet und durch die richtigen Kommandos ersetzt werden. Dies bietet sich meistens fuer haeufig gebrauchtet Kommandos an.
alias ll="ls -llh --color=auto" ist ein gutes (und haeufiges) Beispiel dafuer.
Damit kann die detailierte Ansicht von ls direkt und ohne Tippen der Optionen benutzt werden. Beispiele fuer nuetzliche Aliases sind vielerlei zu finden, aber ein guter Ansatz ist immer die Frage, welche Kommands haeufig benoetigt werden und die daher sinnvoll abgehkuerzt werden koennten.

Fuer Tippfaule bietet es sich an, haeufige Befehle stark abzukuerzen, etwa alias v="vim" oder alias g="git".

Noch mehr “Features”

  • zsh kann nativ sockets und  TCP-Verbindung oeffnen, man kann also ohne weiteres (simple) Netzwerkkommunikation damit (warum auch immer) (zsocket bzw. ztcp)
  • Auch FTP ist nativ vorhanden, falls man nur kurz einen FTP-Client braucht (zftp)
  • Auch eingebauter Kalender ist ist vorhanden (cal)

Abschluss und Weiterfuehrendes

Alles hier ist nur ein kleiner Einblick in die Moeglichkeiten und Konfigurationen und erhebt auf keinen Fall einen Anspruch auf Vollstaendigkeit. Falls weitergehendes Interesse besteht, sind noch ein paar Links angehaengt, die mindestsens mal als Einstieg dienen. Natuerlich sind Korrekturen und Vorschlaege hier erwuenscht und koennen gerne in den Kommentaren oder auf anderem Weg uebermittelt werden. Damit bleibt fuers Erste nur noch der Leserin Spass beim Experimentieren zu wuenschen und vielen engagierten Bastlern zu danken, die zum Einen das Alles gebaut haben, aber auch Beispiele und Dokumentation bereitstellen.

Froehliches Shell-Hacken 🙂

Lorenz Kästle
Lorenz Kästle
Consultant

Lorenz hat seinen Bachelor der Informatik an der FAU gemacht und sich zuletzt mit Betriebssystemen dort beschäftigt. In seiner Freizeit beschäftigt er sich ein wenig mit XMPP und der Programmiersprache Erlang.

Veranstaltungen

Di 18

Icinga 2 Fundamentals Training | Online

Mai 18 @ 09:00 - Mai 21 @ 17:00
Jun 15

stackconf online

Juni 15 - Juni 17
Jun 22

Ansible Fundamentals Training | Online

Juni 22 @ 09:00 - Juni 24 @ 17:00
Jun 22

Kubernetes Quick Start | Online

Juni 22 @ 09:00 - 17:00
Jun 25

Ansible AWX (Tower) Training | Online

Juni 25 @ 09:00 - 17:00