socket

Logging und Netzwerkverbindungen in der Bash

Written by  on Januar 16, 2011

Inspiriert vom Artikel Bash Bashing aus dem Linux Magazin 12/2010 hab ich mich etwas näher mit den Fähigkeiten der Bash beschäftigt.
Zwei interessante Punkte habe ich dabei entdeckt: …

  1. Mit dem Shell-Builtin „exec“ lassen sich ganz einfach Filedescriptoren verbiegen. Das Beispiel dazu im Artikel schreibt dazu:
    exec 77>&1

    , das heißt es wird der Deskriptor 1 – die Standardausgabe – mit dem Deskriptor 77 verbunden. Das dient eigentlich dazu, dass die Standardausgabe gesichert wird, um diese später wiederherstellen zu können. Dabei stellt sich mir allerdings die Frage warum gerade der Deskriptor 77 verwendet wird. Es kann dann mit

    exec > /tmp/logfile

    die gesamte Ausgabe aller folgenden Befehle in eine Datei umgelenkt werden, ohne diese extra angeben zu müssen. Wiederhergestellt wird die Standardausgabe dann über den Befehl

    exec 1>&77
  2. Der zweite wichtige Punkt ist der, dass die Bash bereits alles wichtige mitbringt um eine Netzwerkverbindung aufzubauen. Das sollte sich auch problemlos mit Punkt 1 kombinieren lassen. Um etwa eine Datei von einem Webserver herunterzuladen wird kein zusätzliches Werkzeug wie wget benötigt.
    Das Ergebnis war dieses Beispielscript mit dem z.B. eine Webseite heruntergeladen werden kann:

    #!/bin/bash
    # exec: bash builtin
    # exec 5<> filedescriptor 5 mit netzwerksocket verbinden
    # host www.orf.at; port 80
    exec 5<> /dev/tcp/www.orf.at/80
    # etwas an den socket schicken
    echo -e "GET / HTTP/1.0\n" >&5
    # antwort vom socket abholen (und in ein Datei outputfile schreiben)
    cat <&5 > outputfile
    

Eine Anleitung zu dem Ganzen findet sich auch unter „/dev/tcp“ im „Advanced Bash Scripting Guide“.