Login
Newsletter
Werbung

Do, 20. Februar 2014, 15:00

Shell-Skripte – Kleine Helfer selbst gemacht

Mit Shell-Skripten sind kleine Helfer schnell selbst geschrieben. Sie haben den Vorteil, dass man sich keine langen Befehlszeilen auswendig merken muss. Es reicht dann, einfach das eigene Shell-Skript aufzurufen.

Spielend lernen

Eine erste Einführung in die Shell findet man im Artikel Nur keine Angst: Effektives Arbeiten mit der Shell in freiesMagazin 04/2013. Für die Shell gibt es noch viele andere Bezeichnungen, wie beispielsweise Kommandozeile, Konsole oder Terminal.

Wer die Einführung schon gelesen hat und sein Wissen über Shell-Befehle noch weiter vertiefen will, sollte sich das Spiel Terminus einmal ansehen. Es ist ein textbasiertes Computer-Rollenspiel, das einem dabei helfen soll, die Befehle der Kommandozeile zu lernen und zu verinnerlichen. In dem Spiel bewegt man sich mit Hilfe von Shell-Befehlen weiter. Mit pwd sieht man, wo man sich gerade befindet, mit ls schaut man sich um und mit less kann man Gegenstände betrachten.

Terminus erinnert ein bisschen an das Spiel NetHack, ein Computer-Rollenspiel mit ASCII-Grafik, bei dem man durch die Spielsteuerung schon erste Befehle für den Editor Vi/Vim gelernt hat.

Kurz-URLs expandieren

Als Beispiel für den kleinen Helfer wird ein Skript erstellt, das Kurz-URLs expandiert. Kurz-URLs verkürzen die meist für Suchmaschinen optimierten Links von Internetseiten auf wenige Zeichen. Der Dienst tinyurl.com war einer der ersten, die kurze URLs als simple HTTP-Weiterleitung auf die lange URL anbot. Mittlerweile gibt es schon viele mehr.

Mit Twitter und seiner Beschränkung auf 140 Zeichen pro Nachricht traten diese Dienste ihren Siegeszug an, da eine URL, die man gerne teilen möchte, ansonsten schnell mal die Zeichengrenze eines Tweets sprengen kann. Solche Kurz-URLs haben allerdings auch einen Haken: Man sieht ihnen am Domain-Namen nicht an, wo sie hinführen. Wenn man Pech hat, führt einen der Link geradewegs auf eine präparierte Seite mit Malware.

Informationen mit Wget holen

Zur Überprüfung der Kurz-URLs kann man Wget benutzen, was meist schon mit der Linux-Distribution der eigenen Wahl installiert ist oder schnell installiert werden kann. Mit Wget kann man über das Terminal Dateien aus dem Internet herunterladen, wobei es auch noch ein hervorragender Downloadmanager ist. Möchte man zum Beispiel alle Bild-Dateien mit der Endung PNG von einer Homepage herunterladen, reicht der Befehl:

$ wget -r -A png http://www.example.de/

Bricht man den Download ab, kann man später die Option -c an den Befehl anhängen, um den Download dort fortzusetzen, wo er ausgesetzt hat. Darüber hinaus kann man mit Wget auch den Status des Webservers abfragen, der die Seite ausliefert, zu der die Kurz-URL führt:

$ wget --server-response -qO- 0cn.de/y6ck

Die Option --server-response holt nur eine Antwort vom Webserver, ohne ihn dabei zu besuchen. Die Option -q sorgt dafür, dass unnötige Informationen nicht auf der Kommandozeile ausgegeben werden. Mit O- wird die Startseite, z.B. index.html, direkt auf die Standardausgabe des Terminals (STDOUT) geschrieben. Andernfalls würde Wget sie herunterladen. Zum Schluss folgt noch die Kurz-URL, die in diesem Fall mit dem Dienst 0cn.de erstellt wurde. Da die Ausgabe des Befehls durch den Quelltext der Startseite, die ins Terminal geschrieben wird, sehr lang ist, wird er noch um die Option --max-redirect=0 erweitert. Damit dringt Wget auf der Webseite nicht tiefer als bis zur Auflösung der URL vor.

$ wget --max-redirect=0 --server-response -qO- 0cn.de/y6ck
  HTTP/1.1 302 Moved Temporarily
  Date: Thu, 09 Jan 2014 21:03:30 GMT
  Server: Apache/2.2.3 (CentOS)
  Location: http://www.freiesmagazin.de/freiesMagazin-2014-01
  Content-Length: 0
  Connection: close
  Content-Type: text/html; charset=utf-8

Filtern mit Grep

Da letztendlich nur das Ziel interessiert, zu dem der gekürzte Link führt, benötigt man die Zeile mit der Location. Das Ausschneiden der Zeile erledigt Grep (siehe auch grep – Eine kleine Einführung, freiesMagazin 10/2009).

Allerdings wird es jetzt ein bisschen verzwickt, da Wget noch eine kleine Besonderheit hat. Alle Befehle und Programme, die in der Shell gestartet werden, bekommen drei Kanäle zugewiesen. Zum einen den Standardeingabekanal STDIN, der auch die Nummer 0 hat und normalerweise die Eingaben von der Tastatur liest. Zum anderen den Standardausgabekanal STDOUT mit der Nummer 1, der die Ausgabe des Befehls auf den Bildschirm schreibt. Zum Schluss den Standardfehlerkanal STDERR mit der Nummer 2, der auch seine Ausgaben auf den Bildschirm bringt.

Die Besonderheit von Wget ist nun, dass es den HTTP-Header an die Standardfehlerausgabe (STDERR) übergibt. Der Datenstrom von Wget muss vorher mit 2>&1 in die Standardausgabe (STDOUT) umgeleitet werden, wovon Grep das Ergebnis dann übernehmen kann. Ansonsten würde Grep keine Daten erhalten. Wie beschrieben, ist STDERR in der Shell auch der Kanal 2 und STDOUT der Kanal 1, so dass 2>&1 nur »Leite die Ausgabe von Kanal 2 nach Kanal 1 um« bedeutet.

$ wget --max-redirect=0 --server-response -qO- 0cn.de/y6ck 2>&1 | grep Location
  Location: http://www.freiesmagazin.de/freiesMagazin-2014-01

Ausschneiden mit Awk

Die Ausgabe sieht schon gut aus, allerdings stört noch das Location: vorne. Zur Bearbeitung strukturierter Texte und Strings in der Shell eignet sich gawk sehr gut (siehe auch Keine Angst vor awk – ein Schnelleinstieg, freiesMagazin 06/2009).

In diesem Fall besteht die Struktur aus einer zweispaltigen Ausgabe. Die erste Spalte ist Location:, die zweite die URL. Mit einer Weiterleitung zum Befehl awk '{print $2}', wird nur die zweite Spalte angezeigt:

$ wget --max-redirect=0 --server-response -qO- 0cn.de/y6ck 2>&1 | grep Location | awk '{print $2}'
http://www.freiesmagazin.de/freiesMagazin-2014-01

Kommentare (Insgesamt: 12 || Alle anzeigen )
Re[2]: Immer diese 'pipe' Orgien (Wie meinen?, Sa, 22. Februar 2014)
Re: Immer diese 'pipe' Orgien (Penguin No. 42, Sa, 22. Februar 2014)
Re[2]: Immer diese 'pipe' Orgien (10 Jahre Basherfahrung, Sa, 22. Februar 2014)
Re: Immer diese 'pipe' Orgien (10 Jahre Basherfahrung, Sa, 22. Februar 2014)
Re: Immer diese 'pipe' Orgien (hjb, Sa, 22. Februar 2014)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung