script

ROT13 bash

Written by  on April 23, 2017

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

Written by  on April 10, 2017

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

Written by  on März 21, 2017

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!

Start a not running process via cron

Written by  on Februar 24, 2017

Beispielcode zum Starten eines Prozesses, wenn diese nicht mehr Läuft. Direkt zur Verwendung in Cron.

#!/bin/bash

PROG="apache"
ps -ww aux | grep -v grep | grep $PROG >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
  echo "$PROG found"
else
  echo "$PROG not found"
  # hier restart einfügen
fi

Achtung: Das Script einfach parametrisierbar zu machen via $1 statt $PROG funktioniert nicht, da $1 auch wieder von PS gefunden wird. Es wird daher immer der $PROG found Zweig durchlaufen!

bash select

Written by  on Februar 21, 2017

Die Bash enthält eine Funktion mit der sich ein einfaches Menü darstellen lässt.

#!/bin/bash
# Bash Menu Script Example

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 3")
            echo "you chose choice 3"
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

http://askubuntu.com/questions/1705/how-can-i-create-a-select-menu-in-a-shell-script

Das hat aber ganz schön Nachteile. Alle Beispiele werden in einer Schleife abgewickelt, das brauche ich aber nicht, wenn ich nur einen Durchlauf haben möchte. Ausserdem muss ein Wert 3 Mal angegeben werden. Einmal in der Auflistung, einmal im Case zweig, und noch Einmal wenn ich mit dem Wert tatsächlich etwas anfangen will, wenn er gewählt wurde. Was also tun, um eine einfache Auswahl zu erzeugen, die sich auch einfach erweitern lässt?

Wir verwenden dazu ein Array:

# Warning ARRAY[0] is empty for boundary checking!!!
ARRAY[1]="aa"
ARRAY[2]="ab"

# Display array to screen
for (( i = 1; $i <= ${#ARRAY[@]}; i++ ))
do
  echo "Press $i for ${ARRAY[$i]}"
done

#Read input until we have a valid input
until [[ $input -gt 0 ]] && [[ $input -le ${#ARRAY[@]} ]]; do
  echo "Wert zwischen 1 und ${#ARRAY[@]} waehlen"
  read input
done

# Do what you like with your selection
X=${ARRAY[$input]}

Braucht man mehr Werte im Script, kann man das Array beliebig erweitern. Das könnte man in ein anderes File auslagern. Oder noch was einbauen, dass man eine Taste drücken muss nachdem eine Bildschirmseite ausgegeben wurde.

WordPress und PHP7

Written by  on Januar 18, 2017

Ein neues PHP ist verfügbar für den Webspace! Sofort aktivieren, für WordPress ist das kein Problem!
Doch was passiert – alle Beiträge sind leer.
Was steht im Log?

Got error 'PHP message: PHP Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

Die Lösung habe ich unter wordpress.org gepostet. Dieses nette wp-code-highlight Plugin zerreisst es leider komplett, wenn ich diese Zeilen einfüge.

Gute Infos gibt es auf stackoverflow

Aufräumen wenn ein Script abgebrochen wurde

Written by  on November 29, 2016
#!/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

From String to Array of Strings in Bash

Written by  on Oktober 13, 2016

Definition eines String:

STRING="A"

Definition eines Array:

STRING[0]="A"
STRING[1]="B"

oder

STRING="A"
STRING[1]="B"

Das heißt, nur mit STRING=“A“ kann noch nicht unterschieden werden, ob es nur ein String ist, oder ein Array. D.h. man kann eine bestehende Definition einfach weiterverwenden. Und auch, diese bei Bedarf einfach um ein zweites Feld erweitern.
Wie aber muss der Code aussehen, damit er von Haus aus mit der Erweiterung umgehen kann?

Feststellen der Anzahl der Elemente im Array

${#STRING[*]} 
COUNT=0
while [[ ${COUNT} -lt ${#STRING[*]} ]]; do 
  echo ${STRING[$COUNT]}; 
  COUNT=$((COUNT+1)); 
done

Output für

unset STRING

(kein Output)

Output für

STRING="a"
a

Output für

STRING="a"
STRING[1]="b"
a
b

Voraussetzungen: Elemente im Array von 0 weg zählend durchnummerieren. Das erleichtert das durchlaufen einer Zählschleife ungemein!

Empty Array in Powershell

Written by  on September 30, 2016

Ein leeres Array braucht man z.B. damit eine Schleife die auf das Array zugreift gar nicht erst durchläuft.

Initialisiert wird es mit

$array = @()

Ein Array allgemein definieren

$array="wert1","wert2","wert3"

Die Schleife dazu sieht so aus

foreach ($element in $array)
{
  print ("$element");
}

OpenSSL STR_COPY variable has no value

Written by  on September 23, 2016

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“.