bash

wget isn’t checking CRLs?

Written by  on Dezember 1, 2015

Just a wild theory, but wget is not checking for revoked certificates.
How did I come to this conclusion – and how did I try to verify that?

First some infos about versions – which may be rather important on that topic.

wget --version
GNU Wget 1.15 built on linux-gnu.
openssl version
OpenSSL 1.0.1f 6 Jan 2014

Check about the current certificate, like mine here at https://www.höllrigl.at -> you’ll see a certificate from „StartCom Class 1 Primary Intermediate Server CA“ CA and a CRL at http://crl.startssl.com/crt1-crl.crl

So I’m checking about where to find the CRL and get a nice list

# dig crl.startssl.com +short
www.startssl.com.edgesuite.net.
a1603.g1.akamai.net.
92.122.206.27
92.122.206.10

So let’s see if we find some traffic that goes there – first I tried a ping:

# tcpdump -i eth0 host crl.startssl.com
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:34:23.967704 IP 192.168.3.1 > a92-122-206-10.deploy.akamaitechnologies.com: ICMP echo request, id 18687, seq 1, length 64
21:34:24.016819 IP a92-122-206-10.deploy.akamaitechnologies.com > 192.168.3.1: ICMP echo reply, id 18687, seq 1, length 64

Next thing, fetch that URL with wget

# wget https://www.höllrigl.at
--2015-11-30 21:35:46--  https://www.xn--hllrigl-90a.at/
Resolving www.höllrigl.at (www.xn--hllrigl-90a.at)... 193.239.248.170, 2a04:5540:1:41::10
Connecting to www.höllrigl.at (www.xn--hllrigl-90a.at)|193.239.248.170|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html.2’

    [ <=>                                                                                                                                                                                             ] 29,620      --.-K/s   in 0.05s

2015-11-30 21:35:48 (594 KB/s) - ‘index.html.2’ saved [29620]

Now I’d like to show to you the dumped packages in tcpdump – but there are none.
Other strong indicators are, that there only started to be a ‚–crl-file=file‘ option to wget starting with 1.16, which allows you to check your certificate against a locally stored CRL file.

grep -v

Written by  on Oktober 29, 2015

Wie sucht man ob ein Prozess läuft?

# ps aux | grep smb
root       699  0.0  0.4  28800  4036 ?        Ss   Oct22   0:43 smbd -F
root       768  0.0  0.1  28800  1604 ?        S    Oct22   0:04 smbd -F
root     21411  0.0  0.0   4680   772 pts/0    S+   18:06   0:00 grep --color=auto smb

Das ist zuviel Output, weil auch der grep-Prozess selber angezeigt wird. Dafür gibt es eine einfältige Lösung:

# ps aux | grep smb | grep -v grep
root       699  0.0  0.4  28800  4036 ?        Ss   Oct22   0:43 smbd -F
root       768  0.0  0.1  28800  1604 ?        S    Oct22   0:05 smbd -F

Aber wie geht es besser?

ps aux | grep [s]mb
root       699  0.0  0.4  28800  4036 ?        Ss   Oct22   0:43 smbd -F
root       768  0.0  0.1  28800  1604 ?        S    Oct22   0:05 smbd -F

Warum funktioniert das? Ganz einfach, weil in der Prozessliste jetzt der String „smb“ nicht mehr vorkommt beim grep-Befehl, sondern der String „[s]mb“. Gesucht wird von dem Befehl aber trotzdem nach „smb“.
Braucht man nur die PID vom Prozess geht es aber einfacher:

# pgrep smb
699
768

Soll das ganze nur zum Beenden der Prozesse genutzt werden, braucht man gar keinen grep mehr.

# killall smbd

Dateien nach Datum Sortieren

Written by  on Oktober 22, 2015

Dateien sortieren nach Datum geht mit dem simplen „ls“ mit der Option „-t“.
Aber wie geht das Übergreifend über verschiedene Ordner?

$ ls Windows/* Programme/* -ldt
drwxr-x---    1 42949672 42949672         0 Oct 22 20:48 Windows/Prefetch
-rwxrwx---    1 SYSTEM   42949672       275 Oct 22 20:24 Windows/WindowsUpdate.log
drwxr-x---    1 42949672 42949672         0 Oct 22 20:14 Windows/Temp
drwxrwx---    1 42949672 42949672         0 Oct 22 20:10 Windows/Microsoft.NET
drwxrwx---    1 SYSTEM   42949672         0 Oct 22 19:28 Windows/AppReadiness
-rwxrwx---    1 SYSTEM   42949672     67584 Oct 22 19:18 Windows/bootstat.dat
drwxrwxr-x    1 Administ 42949672         0 Oct 21 21:08 Windows/Installer
drwxrwx---    1 SYSTEM   42949672         0 Oct 21 21:07 Programme/Java
drwxrwx---    1 42949672 42949672         0 Oct 21 21:03 Windows/INF
-rwxrwx---    1 SYSTEM   42949672     34668 Oct 20 21:18 Windows/setupact.log
drwxr-x---    1 42949672 42949672         0 Oct 20 19:23 Windows/WinSxS
drwxrwx---    1 Administ 42949672         0 Oct 20 19:20 Windows/CbsTemp
drwxrwx---    1 42949672 42949672         0 Oct 20 19:20 Windows/SysWOW64
drwxrwx---    1 42949672 42949672         0 Oct 20 19:20 Windows/System32
drwxrwx---    1 SYSTEM   42949672         0 Oct 14 19:13 Programme/NVIDIA Corporation
drwxrwx---    1 SYSTEM   42949672         0 Oct 14 19:13 Windows/Help
-rwxrwx---    1 Administ 42949672      4882 Oct 13 22:18 Windows/PFRO.log
drwxrwx---    1 42949672 42949672         0 Oct 13 22:18 Windows/AppPatch
drwxrwx---    1 42949672 42949672         0 Oct 13 20:57 Windows/Fonts
drwxrwx---    1 42949672 42949672         0 Oct 13 20:57 Windows/twain_32
drwxrwx---    1 SYSTEM   42949672         0 Oct 13 20:57 Programme/HP
drwxrwx---    1 Administ 42949672         0 Oct 13 20:49 Windows/assembly
-rwxrwx---    1 SYSTEM   42949672       478 Oct 13 20:06 Windows/win.ini
drwxrwx---    1 SYSTEM   42949672         0 Oct 13 20:04 Windows/PCHEALTH
drwxrwx---    1 42949672 42949672         0 Oct  5 18:48 Windows/L2Schemas
drwxrwx---    1 42949672 42949672         0 Oct  5 18:48 Windows/Provisioning
drwxrwx---    1 42949672 42949672         0 Oct  5 18:48 Windows/PurchaseDialog
drwxrwx---    1 SYSTEM   42949672         0 Sep 20 08:30 Programme/Oracle
drwxrwx---    1 Administ Administ         0 Sep 19 08:58 Windows/Tasks
drwxrwx---    1 42949672 42949672         0 Sep  9 18:28 Programme/Windows Journal
drwxrwx---    1 SYSTEM   42949672         0 Sep  6 08:52 Programme/Calibre2
drwxrwx---    1 42949672 42949672         0 Aug 22 08:51 Windows/DevicesFlow
drwxrwx---    1 Administ UsersGrp         0 Aug 18 22:16 Programme/FileZilla FTP Client
drwxrwx---    1 SYSTEM   42949672         0 Aug 15 17:30 Programme/7-Zip

...

Sortierung umdrehen:

ls Windows/* Programme/* -ldrtR
-rwxrwx---    1 SYSTEM   42949672      1405 Jun 10  2009 Windows/msdfmap.ini
-rwxrwx---    1 SYSTEM   42949672       219 Jun 10  2009 Windows/system.ini
-rwxrwx---    1 SYSTEM   42949672    302448 Mar  8  2012 Windows/WLXPGSS.SCR
drwxrwx---    1 Administ 42949672         0 Feb  2  2015 Windows/CSC
-rwxrwx---    1 SYSTEM   42949672      1313 Feb  2  2015 Windows/TSSysprep.log
lrwxrwxrwx    1 SYSTEM   42949672        36 Feb  2  2015 Programme/Gemeinsame Dateien -> /drives/c/Program Files/Common Files
drwxrwx---    1 SYSTEM   42949672         0 Feb  2  2015 Programme/Microsoft Analysis Services
drwxrwx---    1 SYSTEM   42949672         0 Feb  2  2015 Programme/Microsoft Sync Framework
drwxrwx---    1 SYSTEM   42949672         0 Feb  2  2015 Programme/Microsoft SQL Server Compact Edition
drwxrwx---    1 SYSTEM   42949672         0 Feb  2  2015 Programme/Microsoft Office
drwxrwx---    1 SYSTEM   42949672         0 Feb  2  2015 Programme/Microsoft Synchronization Services
-rwxrwx---    1 Administ UsersGrp       202 Feb  3  2015 Windows/DirectX.log
drwxrwx---    1 SYSTEM   42949672         0 Feb  3  2015 Programme/Windows Live
-rwxrwx---    1 SYSTEM   42949672     15936 Feb  4  2015 Windows/IE11_main.log
drwxrwx---    1 Administ UsersGrp         0 Feb  7  2015 Programme/Tracker Software
-rwxrwx---    1 Administ UsersGrp     10446 Apr 28 10:36 Windows/DPINST.LOG
drwxrwx---    1 Administ UsersGrp         0 Apr 28 10:52 Windows/Hewlett-Packard
...

Bash: Variablen Bearbeiten

Written by  on September 24, 2015

Die Bash kann einiges mit Variablen anstellen, was man in vielen Scripten relativ kompliziert gelöst sieht.

Ein Beispiel, das in vielen Scripten vorkommt: Eine Ausgabedatei soll genau so heißen wie die Eingabedatei, aber eine andere Erweiterung haben.

A="test.txt"
B="${A%%.txt}.csv"

Was steht jetzt in Variable B?

echo $B
test.csv

Wie funktioniert das?
Mit dem ‚%‘-Operator kann man von einer Variable Zeichen vom Ende her löschen.
Mit ‚%%‘ werden auch mehrere Vorkommen der Variable vom Ende her gelöscht.

Vom Anfang her löschen geht mit ‚#‘

Ersetzen ähnlich wie mit sed geht über den ‚/‘-Operator, ‚^‘ und ‚,‘ machen Groß- bzw. Kleinbuchstaben.

Schöne Beispiele dazu finden sich im Web z.B. beim Linuxmagazin.

Näheres dazu ist unter dem Suchbegriff „Parameter Expansion“ zu finden. Auch in der Manpage von bash.

Verschlüsseln auf der Shell

Written by  on Mai 3, 2015

Um mal eben eine Datei oder einen Stream auf der Shell zu verschlüsseln kann man bcrypt oder ccrypt verwenden. Das ganze funktioniert etwa so:

~ echo hallo | ccrypt -f > output
Enter encryption key:
Enter encryption key: (repeat)
~ cat output
u~�-�x��
O���Ļ_U
~ ccrypt -f -d < output
Enter decryption key:
hallo

Beschrieben zum Beispiel unter Encrypt Files on Linux

bash: translate

Written by  on März 1, 2015

Was macht tr?
tr - translate or delete characters
Wie kann man Zeichen löschen?
-d, --delete
delete characters in SET1, do not translate

Ein Testfile:
# cat test
a
b
c
d

Dann ersetzen wir mal die Zeilenumbrüche:

# cat test | tr "\n" -d
a-b-c-d-

Ups – so nicht! Das verhält sich anders als in der Man Page beschrieben…
Aber mit der anderen Reihenfolge der Parameter – schon klappt es:

cat test | tr -d "\n"
abcd

Die Bash austricksen

Written by  on Januar 30, 2015

Folgende Problemstellung: In einem Shellscript soll eine Variable unter einfachen Hochkomma eingefügt werden. Von Haus aus geht das nicht, weil das einfache Hochkomma die Variable vor dem Auflösen durch die Shell schützt. Durch doppelte Hochkomma ersetzen geht auch nicht, weil die ebenfalls schon vorkommen und erhalten bleiben sollen weil diese Syntax noch vom nächsten Tool an diesen Stellen nötig sind.

> X=xy
> echo '"ab" "cd" "$X"'
"ab" "cd" "$X"

So klappt es schon mal nicht. Statt $X hätten wir gerne „xy“ da stehen. Was liegt also näher, als mit dem gut alten sed zu ersetzen?

echo $(echo '"ab" "cd" "$X"' | sed s/\$X/$X/g)
"ab" "cd" "xy"

Schon klappt die Ersetzung.
Wie funktioniert das jetzt genau? Im sed wird der String „$X“ mit dem Inhalt von $X ersetzt. Wichtig ist dabei das $-Zeichen mit einem \ zu quoten.

Locking auf der Bash

Written by  on November 29, 2014

Dies ist eine aktualisierte Version von Locking auf der Bash vom  19. Mai 2012. Flock für File Locking zu benutzen hat sich seitdem leicht verändert.

Dazu ein neues Testscript test.sh:

#!/bin/bash
echo start
sleep 20
echo end

Der Aufruf lautet jetzt

flock -w1 -x ./test.lock ./test.sh

Das Lockfile wird neu angelegt. Es ist nicht mehr möglich das Scriptfile selber auch als Lockfile zu benutzen. Versucht man es doch führt das zur Fehlermeldung

# flock -w1 -x ./test.sh ./test.sh
flock: ./test.sh: Text file busy

Jetzt zwei Mal das Script starten – wegen dem Timeout mit -w1 läuft es nur ein Mal

$ flock -w1 -x ./test.lock ./test.sh &amp;
[1] 19423
$ start
flock -w1 -x ./test.lock ./test.sh &amp;
[2] 19426
$ jobs
[1]- Running flock -w1 -x ./test.lock ./test.sh &amp;
[2]+ Exit 1 flock -w1 -x ./test.lock ./test.sh
$ end
[1]+ Done flock -w1 -x ./test.lock ./test.sh

 

Bücher zur Shell Programmierung bei Amazon

Speed Up Search & Replace in Shellscripts

Written by  on Oktober 3, 2014

Als erstes erzeugen wir ein paar Testdaten:

for i in {0..100000..1}; do echo "y $i $RANDOM "; done > testfile

Die Testdaten sehen jetzt etwa so aus (ca. 15MB):

head testfile
y 0 8229
y 1 32515
y 2 13193
y 3 31231
y 4 27663
y 5 24114
y 6 20325
y 7 5351
y 8 1576
y 9 21936
Wir ersetzen alle y durch x mit awk:
# time awk '{ print "x "$2" "$3 }' < testfile > /dev/null
real 0m5.942s
user 0m5.672s
sys 0m0.088s

und jetzt mit sed

# time sed s/"y"/"x"/g testfile > /dev/null
real 0m4.870s
user 0m4.644s
sys 0m0.072s

Wir schränken die suche ein – nach dem ersten Treffer darf abgebrochen werden

# time sed s/"y"/"x"/ testfile > /dev/null
real 0m3.560s
user 0m3.380s
sys 0m0.084s

Wir suchen gezielt nach Zeilenanfang

# time sed s/"^y"/"x"/ testfile > /dev/null
real 0m3.604s
user 0m3.416s
sys 0m0.104s

Und ersetzen auch Zeilenanfang

# time sed s/"^y"/"^x"/ testfile > /dev/null
real 0m3.575s
user 0m3.428s
sys 0m0.064s

Fazit: Wenn man das richtige Werkzeug zur richtigen Zeit benutzt lassen sich recht einfach 40% einsparen! AWK schneidet hier deutlich langsamer ab, weil erst die Parameter geparsed werden müssen!

Zählschleife in der Bash

Written by  on September 21, 2014

Ein einfaches Beispiel, wie zählen in der Bash funktioniert.

Der For-Schleife werden die Werte für Start, End und Schrittweite übergeben.

for i in {0..100..1}
do
  command $i
done

Dazu noch ein praktisches Beispiel:

> for i in {0..5..1}
> do
> echo $i
> done
0
1
2
3
4
5