shell
ROT13 bash
Also auf die Idee bin ich noch nicht gekommen, einen ROT13 einfach mit ‚tr‘ zu erzeugen:
echo "Hallo Welt" | tr [a-zA-Z] [n-za-mN-ZA-M] Unyyb Jryg echo "Unyyb Jryg" | tr [a-zA-Z] [n-za-mN-ZA-M] Hallo Welt
Powershell Stringverwendung
Ein Script verhält sich anders auf Windows 2008 und Windows 2012? Scheinbar hat sich die Stringverarbeitung leicht verändert. Wo unter 2012 eine Variable aufgelöst wird, passiert das unter 2008 nicht:
Windows 2008 R2
$A="IchBinEineVariable" echo "-p$A" -pIchBinEineVariable echo -p"$A" -p"$A" echo -p$A -p$A
Windows 2012 R2
$A="IchBinEineVariable" echo "-p$A" -pIchBinEineVariable echo -p"$A" -pIchBinEineVariable echo -p$A -p$A
Powershell 32 Bit vs. 64 Bit
Wenn einem Certutil.exe bei manchen Parametern mitteilt, dass manche Klassen nicht geladen werden könne, ist möglicherweise die 32 Bit vs. 64 Bit Problematik daran schuld.
C:\windows\System32\certutil.exe -view -restrict "Issued Common Name=<CN>, Disposition=20" -out "RequestID,RequesterName" -config "<CAHostName>\<CAName>" CertUtil: -view command FAILED: 0x80040154 (-2147221164) CertUtil: Class not registered
Wie tritt das auf, wenn ich doch ein 64 Bit Betriebssystem habe? Und wie stelle ich fest, was ich für eine PowerShell am laufen habe?
Eine „normale“ PowerShell:
> [Environment]::Is64BitProcess True
Die „gleiche“ PowerShell geöffnet in MobaXterm:
> [Environment]::Is64BitProcess False
Erst Version 10 von MobaXterm soll das Problem beheben und auf 64 Bit Systemen die korrekte PowerShell öffnen.
Interessantes Detail am Rande, eine 64 Bit PowerShell liegt unter C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe die 32 Bit Version ist zu finden unter C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe!
Aufräumen wenn ein Script abgebrochen wurde
#!/bin/bash TMPFILE1=$(mktemp /tmp/im1.XXXXXX) TMPFILE2=$(mktemp /tmp/im2.XXXXXX) trap "rm -f $TMPFILE1 $TMPFILE2; exit 1" INT sleep 10
Frei nach How Linux Works, S. 264
OpenSSL STR_COPY variable has no value
Openssl kann Shellvariablen im der Konfigurationsdatei verarbeiten. Kommt dabei eine Fehlermeldung wie
openssl.exe version 6870300:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 19
liegt das daran, dass die Shellvariable nicht definiert ist.
Eine leere Variable dagegen ist aber OK.
Ich dachte schon einen Bug gefunden zu haben. Der Report dafür wurde aber nicht anerkannt, weil das Verhalten so gewünscht und dokumentiert ist.
Wie kommt man zum Fehler? Mit einer Config wie:
[req] promt=no distinguished_name=dn default_md=sha256 default_bits=2048 req_extensions=alt_names [dn] C=AT ST=NOe L=xxx O="org" OU="ou" E="test@example.com" [alt_names] subjectAltName=${ENV::SAN}
Wie repariert man es?
Indem man einen Default Wert in der Config setzt:
SAN="" [req] promt=no distinguished_name=dn default_md=sha256 default_bits=2048 req_extensions=alt_names [dn] C=AT ST=NOe L=xxx O="org" OU="ou" E="test@example.com" [alt_names] subjectAltName=${ENV::SAN}
Dokumentation, wenn auch leicht verwirrend findet man unter https://www.openssl.org/docs/man1.0.2/apps/config.html bzw. https://www.openssl.org/docs/manmaster/apps/config.html für die letzte Version.
Suchen auf der Seite nach Begrif „ENV“.
Windows und die Bash
Spannende Zeiten! Microsoft gibt die Powershell frei für Linux. Und gleichzeitig gibt’s die Bash unter Windows 10.
Wie kommt man zur Shell? Die Installation geht recht einfach laut Anleitung.
Man braucht zumindest Windows 10 Anniversary Update build 14316, das prüft man am einfachsten mit „winver.exe“
Dann aktiviert man den Entwicklermodus. Einfach Windows Taste -> „Entwicklerfunktionen verwenden“
Als nächstes „Windows Features aktivieren oder deaktivieren“ und „Windows Subsystem for Linux (beta)“ wählen. Neustarten. Installation abschließen, indem der Befehl „bash“ ausgeführt wird.
Von Batch zu PowerShell
Ein guter Grund Scripte zu migrieren könnte sein, dass viele Konstrukte einfacher und lesbarer geworden sind.
Es ist eher schwierig auf einen Blick genau zu sagen, was hier für Dateinamen erzeugt werden. Weil scheinbar Strings an festen Positionen zerschnitten werden. Das könnte ausserdem Probleme geben, wenn verschiedene Sprachversionen zum Einsatz kommen:
"%PATH%\%DATE%_%HOUR: =0%.%TIME:~3,2%.%TIME:~6,2%.zip"
Eleganter auf der Powershell
"$PATH\$(get-date -format dd.mm.yyyy_HH.mm.ss).zip"
VI Insert Mode and the Cursor Keys
Wenn der Editor vi im Insert Mode mit den Pfeiltasten statt den Cursor zu bewegen die Buchstaben A, B, C und D ausgibt lässt sich das leicht beheben.
~/.vimrc
set nocompatible
Hitting arrow keys adds characters in vi editor – Ask Ubuntu
bash timeout
Was tun, wenn man in einem Script nicht ewig auf einen externen Timeout warten möchte?
Wir rufen timeout auf. Das sieht z.B. so in einer Busy Box aus:
$ timeout -t 5 sleep 10
Terminated
$ echo $?
143
Hingegen auf einem Ubuntu 14.04 so:
$ timeout 2 sleep 5
$ echo $?
124
Auch wenn das nicht ganz einheitlich ist, doch ein tolles tool um z.B. curl nach ein paar Sekunden abzubrechen, wenn ein Download nicht funktioniert.
How to logrotate
Just a short example of how some basic logrotate in bash could work:
# Logrotate with more than 5 Megabytes
LOGFILESIZE=$(stat -c%s "$LOGFILE")
if [[ $((LOGFILESIZE/1024/1024)) -gt 5 ]]; then
mv $LOGFILE $LOGFILE.old
fi