Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 15 Die Praxis
  gp 15.1 Alltägliche Lösungen
    gp 15.1.1 Auf alphabetische und numerische Zeichen prüfen
    gp 15.1.2 Auf Integer überprüfen
    gp 15.1.3 echo mit oder ohne -n
  gp 15.2 Datei-Utilities
    gp 15.2.1 Leerzeichen im Dateinamen ersetzen
    gp 15.2.2 Dateiendungen verändern
    gp 15.2.3 Nach veränderten Dateien in zwei Verzeichnissen vergleichen
  gp 15.3 Systemadministration
    gp 15.3.1 Benutzerverwaltung
    gp 15.3.2 Systemüberwachung
  gp 15.4 Backup-Strategien
    gp 15.4.1 Warum ein Backup?
    gp 15.4.2 Sicherungsmedien
    gp 15.4.3 Varianten der Sicherungen
    gp 15.4.4 Bestimmte Bereiche sichern
    gp 15.4.5 Backup über ssh mit tar
    gp 15.4.6 Daten mit rsync synchronisieren
    gp 15.4.7 Dateien und Verzeichnisse per E-Mail versenden
    gp 15.4.8 Startup-Scripts
  gp 15.5 World Wide Web und HTML
    gp 15.5.1 Analysieren von access_log (Apache)
    gp 15.5.2 Analysieren von error_log (Apache)
  gp 15.6 CGI (Common Gateway Interface)
    gp 15.6.1 CGI-Scripts ausführen
    gp 15.6.2 CGI-Environment ausgeben
    gp 15.6.3 Einfache Ausgabe als Text
    gp 15.6.4 Ausgabe als HTML formatieren
    gp 15.6.5 Systeminformationen ausgeben
    gp 15.6.6 Kontaktformular
    gp 15.6.7 Noch ein Tipp


Rheinwerk Computing

15.6 CGI (Common Gateway Interfacedowntop

CGI ist eine Schnittstelle, mit der Sie z. B. Anwendungen für das Internet schreiben können. Diese CGI-Anwendungen laufen dabei auf einem (Web-)Server (wie beispielsweise dem Apache) und werden meistens von einer HTML-Webseite mithilfe eines Webbrowsers aufgerufen.

Das Verfahren der CGI-Schnittstelle ist ziemlich einfach. Die Daten werden ganz normal von der Standardeingabe (stdin) oder von den Umgebungsvariablen empfangen und wenn nötig über die Standardausgabe (stdout) ausgegeben. Im Allgemeinen handelt es sich dabei um ein dynamisch erzeugtes HTML-Dokument, das Sie in Ihrem Browser betrachten können. Sind diese Voraussetzungen gegeben, können CGI-Anwendungen praktisch mit jeder Programmiersprache erstellt werden. Das CGI-Programm selbst, welches Sie erstellen, ist ein ausführbares Programm auf dem Webserver, das nicht von einem normalen User gestartet wird, sondern vom Webserver als ein neuer Prozess.

Normalerweise setzt man für CGI-Scripts die Programmiersprachen Perl, PHP, Java, Python, Ruby oder C ein, aber im Grunde ist die Sprache absolut zweitrangig. Die Hauptsache ist, dass sie eine Standardein- und eine Standardausgabe besitzt und selbstverständlich auf dem Rechner, auf dem diese ausgeführt wird, auch verstanden wird. Für kleinere Auf- bzw. Ausgaben können Sie selbstverständlich auch ein Shellscript verwenden. Damit können Sie beinahe alle Shellscripts, die Sie in diesem Buch geschrieben haben, auch über den Browser aufrufen und ausführen lassen.


Hinweis   Wer denkt, CGI in C ist etwas »Unmögliches«, der darf gern auf meine Webseite kommen. Das komplette Content Management System (kurz CMS) wurde von meinem Fachgutachter in C geschrieben.


Auch wenn es sich recht aufregend anhört, CGI-Scripts in Shell zu erstellen, finden Sie hier nur einen kurzen Anriss zu diesem Thema. Vorwiegend geht es mir darum, dass Sie mithilfe der Shellscripts eine Art Schnittstelle für Ihre geschrieben Shellscripts schreiben können, beispielsweise um die Auswertung von access_log auf dem Browser vorzunehmen.


Rheinwerk Computing

15.6.1 CGI-Scripts ausführen  downtop

Um CGI-Scripts auf einem Server auszuführen, ist leider mehr als nur ein Browser erforderlich. Sofern Sie den ganzen Vorgang lokal testen wollen, benötigen Sie einen laufenden Webserver (im Beispiel ist immer vom Apache Webserver die Rede). Das Ganze ist gerade für Anfänger nicht ganz so einfach nachzuvollziehen. Einfach haben Sie es natürlich, wenn Sie Ihre Scripts auf einem bereits konfigurierten Webserver ausführen können – wie dies etwa bei einem Webhoster der Fall ist.

Zuerst müssen Sie herausfinden, wo Sie die Shellscripts auf Ihrem Webserver ausführen können, gewöhnlich ist dies im /cgi-bin-Verzeichnis. Allerdings kann man einen Webserver auch so konfigurieren (httpd.conf), dass man aus jedem Unterverzeichnis ein Script ausführen kann. In der Regel verwendet man als Dateiendung ».cgi«. Wenn es nicht möglich ist, ein CGI-Script auszuführen, kann es sein, dass Sie die Option ExecCGI in der Konfigurationsdatei httpd.conf anpassen oder die Schnittstelle mit der Datei .htaccess aktivieren müssen. Außerdem muss beachtet werden, dass dieses Script für jedermann lesbar und ausführbar ist, weil die meisten Webserver eine Webanfrage als User nobody oder similar ausführen. Leider kann ich hier nicht im Detail darauf eingehen, daher hierzu nochmals kurz die nötigen (möglichen) Schritte, um ein CGI-Script auf einem Webserver auszuführen (entsprechende Rechte vorausgesetzt):

gp  Speichern Sie das Script mit der Dateiendung ».cgi«.
gp  Kopieren Sie das Script mittels cp oder scp in ein Verzeichnis des Webservers (bspw. /cgi-bin) – abhängig von der Konfiguration, wo Sie CGI-Scripts ausführen können/dürfen.
gp  Setzen Sie die Zugriffsrechte für das entsprechende Script (chmod go+rx script.cgi).
gp  Starten Sie den Webserver, falls dies nicht schon geschehen ist.
gp  Starten Sie einen Webbrowser Ihrer Wahl und rufen Sie das CGI-Script auf. Befindet es sich z. B. im Verzeichnis /cgi-bin auf dem lokalen Rechner, so lautet die URL gewöhnlich http://localhost/cgi-bin/script.cgi oder hier unter http://www.pronix.de/cgi-bin/script.cgi.

Noch ein paar Tipps, falls es nicht klappt:

gp  Sind die Zugriffsrechte richtig gesetzt? Dies gilt sowohl für das CGI-Script als auch für den Zugriff auf die Verzeichnisse des Webservers überhaupt.
gp  Ein Fehlerstatus 500 des Browsers signalisiert häufig einen Fehler in Ihrem Script. Testen Sie das Script am besten in der Kommandozeile.
gp  Haben Sie die richtige URL im Browser eingegeben bzw. stimmt der Pfad zum Script?
gp  Läuft der Webserver überhaupt?
gp  Ein Blick in access_log und error_log hilft Ihnen beim Suchen enorm weiter. Lassen Sie beispielsweise im Hintergrund tail -f /pfad/zur/logdatei/ error_log laufen, denn alle Fehler tauchen hier auf.

Rheinwerk Computing

15.6.2 CGI-Environment ausgeben  downtop

Das folgende Script gibt alle Umgebungsvariablen auf dem Browser aus. Diese Umgebungsvariablen enthalten Informationen zum Webserver wie auch zum Webclient (bspw. Browser). Aufgeteilt werden diese Informationen grob in drei verschiedene Bereiche (ohne näher darauf einzugehen):

gp  HTTP-Anfrage-Paket
gp  Webserver
gp  HTTP-Anfrage-Header des Webbrowsers
#!/bin/sh
# myenv.cgi
# Umgebungsvariablen auf einem Server anzeigen
echo "Content-type: text/html"
echo
echo "<html><body><h2>Umgebungsvariablen von"\
     " `uname -n` (`date`)</h2>"
echo "<pre>"
# Wenn env nicht vorhanden, dann printenv ausführen ...
env || printenv
echo "</pre></body></html>"

Das Script bei der Ausführung sehen Sie in Abbildung 15.1.


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.1   Das Script myenv.cgi bei der Ausführung


Einen Hinweis noch zu:

echo "Content-type: text/html"

Damit teilen Sie dem Webserver mit, dass Ihre CGI-Anwendung ein bestimmtes Dokument ausgibt (Content-Type-Dokument). Im Beispiel handelt es sich um ein HTML-Dokument. Außerdem ist es von Bedeutung, dass hinter dieser Angabe zwei Newline-Zeichen stehen (hier durch die beiden echo-Aufrufe). Damit signalisieren Sie dem Webserver, dass es sich um die letzte »Headerzeile« handelt.


Rheinwerk Computing

15.6.3 Einfache Ausgabe als Text  downtop

Ähnlich einfach wie die Ausgabe der Umgebungsvariablen lässt sich jede andere Ausgabe auf dem Browser realisieren. Wollen Sie zum Beispiel ein Shellscript über einen Link starten, so müssen Sie sich nur ein HTML-Dokument wie folgt zusammenbasteln:

<html>
<head>
  <title>TestCGIs</title>
</head>
<body>
<A HREF="/cgi-bin/areader.cgi?/srv/www/htdocs/docs/kap003.txt">Ein Link</A>
</body>
</html>

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.2   Das HTML-Dokument zum Aufrufen eines Scripts (als Link)


Das folgende Script areader.cgi macht wiederum nichts anderes, als die Textdatei kap003.txt mittels cat auf dem Browser auszugeben. Als Query-String geben Sie hinter dem Fragezeichen an, welche Datei hier gelesen werden soll. Für das Shellscript stellt dies wiederum den ersten Positionsparameter $1 dar. Der Link

/cgi-bin/areader.cgi?/srv/www/htdocs/docs/kap003.txt

besteht also aus zwei Werten, dem Pfad zum Shellscript

/cgi-bin/areader.cgi

und dem ersten Positionsparameter (Query-String)

/srv/www/htdocs/docs/kap003.txt

Ein solcher Query-String kann natürlich ganz andere Formen annehmen, dazu aber später mehr. Hierzu nun das Shellscript areader.cgi:

#!/bin/sh
# Name: areader.cgi
echo "Content-type: text/plain"
echo
cat $1
exit 0

Die Ausführung ist in Abbildung 15.3 zu sehen.


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.3   Das Shellscript areader.cgi bei der Ausführung im Browser


Sicherheitsbedenken

Natürlich dienen diese Beispiele nur als Mittel zum Zweck, um Ihnen zu demonstrieren, wie Sie Shellscripts auch als CGI-Scripts verwenden können, ohne allerdings den Sicherheitsaspekt zu berücksichtigen. Denn im Grunde ist die Zeile

/cgi-bin/areader.cgi?/srv/www/htdocs/docs/kap003.txt

ein ganz böses Foul, das Hackern Tür und Tor öffnet. Manipuliert man diese Zeile um in

/cgi-bin/areader.cgi?/etc/passwd
/cgi-bin/areader.cgi?/etc/shadow

kann der Angreifer in aller Ruhe zu Hause per »Brute Force« das Passwort knacken (sofern dies nicht allzu stark ist – was leider meistens der Fall ist). Zumindest kann der Angreifer auf jeden Fall Systeminformationen sammeln, um eventuelle Schwachstellen des Rechners aufzuspüren.

Ein sicherere Alternative wäre es beispielsweise, die Usereingabe auf [a-z] zu prüfen. Wenn andere Zeichen vorkommen, dann abbrechen, und ansonsten den Pfad und die Endung vom Script ergänzen lassen.

if echo $1 | grep -q '[^a-z]'
then
   echo Schlingel
   exit 0
fi
file="/pfad/nach/irgendwo/$1.txt"
if [ -e $file ]
then
   echo Nueschte
   exit 0
fi

Des Weiteren sollten Sie bei CGI-Programmen immer 0 zurückgeben, wenn alles glatt verlaufen ist, damit überhaupt etwas auf dem Bildschirm ausgegeben wird. Bei vielen Installationen entsteht nämlich bei Rückgabe ungleich 0 der 500er-Fehler.


Rheinwerk Computing

15.6.4 Ausgabe als HTML formatieren  downtop

In der Praxis werden Sie wohl kaum immer nur reinen Text ausgeben, sondern die Ausgabe mit vielen HTML- oder CSS-Elementen verschönern wollen. Im Gegensatz zum Beispiel zuvor ist hierfür nicht allzu viel nötig (geringe HTML-Kenntnisse vorausgesetzt). Zuerst wieder das HTML-Dokument (unverändert):

<html>
<head>
  <title>TestCGIs</title>
</head>
<body>
<A HREF="/cgi-bin/a_html_reader.cgi?/srv/www/htdocs/docs/kap003.txt">Ein Link</A>
</body>
</html>

Als Nächstes das Shellscript areader.cgi, allerdings ein wenig umgeschrieben (und umbenannt) mit einigen HTML-Konstrukten, um den Text browsergerecht zu servieren:

#!/bin/sh
# a_html_reader.cgi
echo "Content-type: text/html"
echo ""
cat << HEADER
<HTML>
<HEAD><TITLE>Ausgabe der Datei: $1</TITLE>
</HEAD>
<BODY bgcolor="#FFFF00" text="#000000">
<HR SIZE=3>
<H1>Ausgabe der Datei: $1 </H1>
<HR SIZE=3>
<P>
<SMALL>
<PRE>
HEADER
cat $1
cat << FOOTER
</PRE>
</SMALL>
<P>
<HR SIZE=3>
<H1><B>Ende</B> Ausgabe der Datei: $1 </H1>
<HR SIZE=3>
</BODY>
</HTML>
FOOTER
exit 0

Das Script bei der Ausführung zeigt Abbildung 15.4.


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.4   Ein einfaches Textdokument, mit HTML formatiert


Soweit haben Sie nun eine HTML-formatierte Ausgabe. Allerdings ist es noch praktischer, den HTML-Teil wiederum in eine extra Datei auszulagern. Dies erhält zum einen die Übersicht des Shellscripts, und zum anderen kann man jederzeit das »Layout« gegen ein anderes austauschen. Ich teile z. B. die beiden Bereiche um den eigentlichen Arbeitsteil des Shellscripts in einen Kopfteil (header.txt) und einen Fußteil (footer.txt) auf. Zuerst die Datei header.txt:

<HTML>
<HEAD><TITLE>Ein Titel</TITLE>
</HEAD>
<BODY bgcolor="#FFFF00" text="#000000">
<HR SIZE=3>
<H1>Ausgabe Anfang: </H1>
<HR SIZE=3>
<P>
<SMALL>
<PRE>

Und jetzt noch die Datei footer.txt:

</PRE>
</SMALL>
<P>
<HR SIZE=3>
<H1><B>Ende</B> der Ausgabe</H1>
<HR SIZE=3>
</BODY>
</HTML>

Beide Dateien können Sie nun auch wieder im Shellscript einfach mit cat ausgeben lassen. Somit sieht das eigentliche Shellscript gegenüber der Version a_html_reader.cgi wie folgt aus:

#!/bin/sh
echo "Content-type: text/html"
echo ""
cat /srv/www/htdocs/docs/header.txt
cat $1
cat /srv/www/htdocs/docs/footer.txt
exit 0

Rheinwerk Computing

15.6.5 Systeminformationen ausgeben  downtop

Wie Sie im Beispiel eben den Befehl cat verwendet haben, so können Sie auch alle anderen Kommandos (je nach Rechten) bzw. ganze Shellscripts ausführen. Das folgende Script gibt z. B. Auskunft über alle aktuell laufenden Prozesse:

#!/bin/sh
# Name: html_ps.cgi
echo "Content-type: text/html"
echo
cat /srv/www/htdocs/docs/header.txt
ps -ef
cat /srv/www/htdocs/docs/footer.txt
exit 0

Das Script bei der Ausführung zeigt Abbildung 15.5.


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.5   Ausgabe aller laufenden Prozesse auf einem entfernten System


Ebenso einfach können Sie hierbei auch andere Shellscripts ausführen lassen. Sinnvoll erscheint mir hierbei die Ausgabe von access_log und error_log. Das folgende Beispiel verwendet das Script readaccess aus Abschnitt 15.5.1:

#!/bin/sh
# Name: html_access_log.cgi
# Apaches access_log analysieren und ausgeben
echo "Content-type: text/html"
echo
cat /srv/www/htdocs/docs/header.txt
./readaccess /pfad/zum/logfile/access_log
cat /srv/www/htdocs/docs/footer.txt
exit 0

Abbildung 15.6 zeigt das Script bei der Ausführung.


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.6   Auswertung von access_log mit dem Browser


Sie sehen, CGI-Scripts können mit der Shell beinahe unbegrenzt verwendet werden.


Rheinwerk Computing

15.6.6 Kontaktformular  downtop

Ein Kontaktformular erfordert eine Eingabe vom Benutzer. Dies auszuwerten, ist wiederum nicht ganz so einfach. Zunächst muss man festlegen, mit welcher Methode diese Daten empfangen werden. Hierbei gibt es die Möglichkeit GET, bei der der Browser die Zeichenkette(n) der Eingaben am Ende der URL anhängt. Bei einem Textfeld »name« mit der Benutzereingabe »Wolf« sieht die URL wie folgt aus:

http://www.pronix.de/cgi-bin/script.cgi?name=wolf

Befindet sich jetzt hier auch noch ein weiteres Textfeld namens »vorname« und die Benutzereingabe lautet »John«, so sieht die URL wie folgt aus:

http://www.pronix.de/cgi-bin/script.cgi?name=wolf&vorname=john

Das Ampersandzeichen & dient hier als Trenner zwischen den einzelnen Variablen/Werte-Paaren. Der Webserver entfernt gewöhnlich diese Zeichenkette und übergibt dies der Variablen QUERY_STRING. Den QUERY_STRING auszuwerten ist die Aufgabe des Programmierers.

Die zweite Möglichkeit ist die Übergabe der Werte mit der POST-Methode. Bei ihr werden die Daten nicht in einer der Umgebungsvariablen abgelegt, sondern in die Standardeingabe (stdin). Sie können somit die CGI-Anwendung so schreiben, als würde die Eingabe von der Tastatur vorgenommen.

Damit Sie sich schon ein Bild vom folgenden Beispiel machen können, soll hier das HTML-Formular bereits erstellt werden, in das anschließend die Eingabe des Benutzers vorgenommen werden kann:

<html>
<head>
  <title>Kontakt</title>
</head>
<body>
<form method="post" action="/cgi-bin/contact.cgi">
<h2>Kontakt-Formular</h2>
<pre>
Name : <input type="text" name="name"><br>
Email: <input type="text" name="email"><br>
Ihre Nachricht:<br>
<textarea rows="5" cols="50" name="comments"></textarea><br>
<input type="submit" value="submit">
</pre>
</form>
</body>
</html>

Das Formular zeigt Abbildung 15.7.


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.7   Das HTML-Kontakt-Formular


In der Zeile

<form method="post" action="/cgi-bin/contact.cgi"

können Sie erkennen, dass in diesem Beispiel die POST-Methode verwendet wird, womit Sie die Daten von der Standardeingabe erhalten.

Würden Sie jetzt in Ihrem Script von der Standardeingabe lesen und dies ausgeben lassen, so würde Folgendes angezeigt (eine Zeile):

name=Juergen+Wolf&email=pronix%40t-online.de&comments=
Eine+Tolle+%22Seite%22+hast+Du+da%21

Also noch lange nicht das gewünschte Ergebnis. Um hieraus die Ergebnisse zu extrahieren, müssen Sie die Standardeingabe parsen, sprich lesefreundlich dekodieren. Ein Überblick über die Zeichen, die hier von besonderer Bedeutung sind:

gp  & – einzelne Formularelemente (sofern es mehrere sind) werden mit diesem Zeichen getrennt.
name=Juergen+Wolf email=pronix%40t-online.de comments=
Eine+Tolle+%22Seite%22+hast+Du+da%21
gp  = – mit diesem Zeichen werden die Variable/Wert-Paare voneinander getrennt.
name Juergen+Wolf email pronix%40t-online.de comments 
Eine+Tolle+%22Seite%22+hast+Du+da%21
gp  + – damit werden die Leerzeichen der eingegebenen Daten getrennt.
name Juergen Wolf email pronix%40t-online.de comments 
Eine Tolle %22Seite%22 hast Du da%21
gp  %XX – Bei einem Prozentzeichen gefolgt von zwei hexadezimalen Ziffern handelt es sich um ASCII-Zeichen mit dem dezimalen Wert von 128 bis 255. Diese hexadezimalen Ziffern müssen in ASCII-Zeichen dekodiert werden.
name Juergen Wolf email pronix@t-online.de comments 
Eine Tolle "Seite" hast Du da!

Die ersten drei Punkte können Sie bspw. folgendermaßen dekodieren:

tr '&+=' '\n \t'

Hiermit ersetzen Sie das Zeichen »&« durch ein Newline-Zeichen, das »+«-Zeichen durch ein Leerzeichen und das »=«-Zeichen durch ein Tabulatorzeichen.

Die hexadezimale Ziffer dekodieren Sie mit einer einzelnen sed-Zeile:

echo -e `sed 's/%\(..\)/\\\x\1/g'`

Hinweis   Nicht mit eingeschlossen sind hierbei die deutschen Umlaute »üäöß...«.


Mehr ist nicht erforderlich, um den Eingabestring von einem HTML-Formular zu parsen. Das folgende Script wertet den Inhalt eines solchen Kontaktformulars aus und sendet diesen mit sendmail an die Adresse »empfaenger«. Am Ende wird noch eine HTML-Seite als Bestätigung auf dem Browser erzeugt.

#!/bin/sh
# Name: contact.cgi
# Auswerten der Formmail
empfaenger="you@host"
( cat << MAIL
From: www@`hostname`
To: $empfaenger
Subject: Kontakt-Anfrage Ihrer Webseite
Inhalt der Eingabe lautet:
MAIL
# Eingabestring dekodieren
cat – | tr '&+=' '\n \t' | echo -e `sed 's/%\(..\)/\\\x\1/g'`
  echo ""
  echo "Abgeschickt am `date`"
) | sendmail -t
echo "Content-type: text/html"
echo ""
echo "<html><body>"
echo "Vielen Dank fuer Ihre Anfrage!"
echo "</body></html>"
exit 0

Das Script bei der Ausführung:


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 15.8   Die Antwortseite nach dem Drücken des Submit-Buttons


Wenn Sie jetzt einen Blick in Ihr Mail-Postfach werfen, werden Sie eine entsprechende E-Mail finden, die zeigt, was im Kontakt-Formular eingegeben wurde.


Rheinwerk Computing

15.6.7 Noch ein Tipp  toptop

Natürlich ist anzumerken, dass Sie nur einen ersten Einblick zum Thema CGI erhalten haben. Wie bereits erwähnt, können Sie sich hierzu auf meiner Homepage http://www.pronix.de (allerdings in der Programmiersprache C) einen etwas umfangreicheren Überblick verschaffen, falls, Sie mehr Informationen dazu benötigen.



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern