Mon, 05 Mar 2007
Kommandozeilen-Tango: Netcat fordert Tar zum Tanz auf
Ich bin ja auch ein Freund von Klickibunti-Software, aber die guten, alten
Kommandozeilen-Tools sind auch nicht zu verachten. Am Wochenende stand ich vor
dem Problem ca. 20 GB von einem Laptop zum nächsten zu befördern. Erst
versuchte ich es mittels SMB. Auf der einen Seite der Leitung ein Mac OS X, auf
der anderen ein Ubuntu Edgy mt GNOME, welche direkt miteinander verbunden
waren. Die Transferrate betrug dabei jämmerliche 2,5 MB/s. Mir dauerte das aber
deutlich zu lang. Glücklicherweise hatte ich mal von einem Freund das kleine,
schicke Tool "netcat" gezeigt bekommen. Im folgenden möchte ich eine
kleine, möglichst verständliche Anleitung geben, ohne wirklich alle
Möglichkeiten von netcat aufzuzeigen. Der Text richtet sich an Interessierte,
die keine (prinzipielle) Scheu vor der Kommandozeile haben, aber auch keine
Geeks sind, also Leute wie Du und ich.
Netcat, oder kurz "nc", ist das Schweizer Taschenmesser für TCP/IP und sollte jedem halbwegs brauchbaren Unix (also auch Mac OS X und GNU/Linux) beiliegen. Es liest Daten aus der Standard-Eingabe (siehe dazu Wikipedia) und schickt sie an einen angegebenen Port auf einem angegebenen Netzwerk-Rechner.
mein.computer.org $ netcat irgendein.computer.net 1234 -q 1 <
eine_datei.txt
- netcat
-
Klar, das Programm selber. Ich schreibe hier
netcataus, auf manchen System ist es aber nur alsnczu finden. - irgendein.computer.net
- Der Hostname des Computers. Mensch kann auch die IP verwenden.
- 1234
- Der Port des Rechners. Dieser ist frei wählbar, darf aber nicht anderweitig belegt sein. Für Ports unter 1024 braucht mensch aber root-Rechte.
- -q 1
-
Die Option
-qveranlasst netcat sich nach einem End-of-File sich zu Beenden. Dabei muss dieser Option ein Wert mitgegeben werden, nach wie viel Sekunden dies der Fall sein soll. In diesem Beispiel nach einer Sekunde. - <
-
Besagt, dass die nachfolgende Datei in die Standard-Eingabe
geleitet wird. Ich finde zwar
"cat eine_datei.txt | netcat..."intuitiver und bildlicher, aber bevor ich von Johl wegen einem useless use of cat gebasht werde ..., hihi. - eine_datei.txt
- ... ist eine beliebige Datei. Dabei ist es egal, um was für Art von Datei es sich handelt.
Das war aber nur die halbe Miete. Auf der anderen Seite muss auch noch jemand diesen Datensstrom annehmen. Es muss sich dabei nicht zwangsläufig um netcat handeln, aber es ist das Naheliegende.
irgendein.computer.net $ netcat -l -p 1234 > eine_datei.txt
- -l
- Anstatt Daten zu senden lauscht es auf eingehende Verbindungen.
- -p 1234
- Hiermit geben wir an, dass netcat auf Port 1234 lauschen soll. Es muss natürlich der gleiche sein, wie jener der bei der ausgehenden Verbindung benutzt wird. Ports sind so wie Kanäle. Wenn ihr auf dem Funkgerät auf Kanal 1 spricht und die Gegenseite auf Kanal 2 lauscht wird das nix mit der Kommunikation.
- > eine_datei.txt
-
Damit leitet mensch die Standard-Ausgabe in eine Datei um. Also
alles was bei netcat hinten rauskommt, wird in die Datei
"eine_datei.txt"geschrieben. Der Dateiname kann völlig frei gewählt werden. Es hätte auch hier"irgendwas.txt"stehen können.
Die Empfänger-Seite muss übrigens als erstes gestartet werden. Sonst bekommt ihr den Fehler "Connection refused". Ich fand es aber verständlicher, erst das Senden und dann das Empfangen zu erklären.
Netcat kopiert also Daten über das Netzwerk. Dabei ist es sehr schnell, aber auch sehr minimalistisch. Eigentlich kopiert es nur Datenströme. Die Daten an Netcat zu verfüttern und auf der anderen Seite wieder auseinander zu sortieren und in Dateien zu speichern ist Euer Job.
Das oben genannte Beispiel ist für das Kopieren einer einzelnen Datei schon ganz brauchbar. Wie sieht es nun mit ganzen Verzeichnissen aus? Dazu nutzen wir den guten, alten Klassiker "tar". Es kommt noch aus Zeiten der Bandlaufwerke und steht für "tape archiver (Bandarchivierer)". Wir nutzen tar um ein Verzeichnis zu packen, also in eine einzelne handliche Datei zu schreiben. Aber wir schreiben die Datei nicht auf die Festplatte, sondern gleich in die Standard-Ausgabe, wo netcat schon drauf wartet.
mein.computer.org $ tar c Meine_Dateien/ | netcat
irgendein.computer.net 1234 -q 1
Das unscheinbare c steht für create. Auf der anderen Seite nehmen wir
das Päckchen mit netcat an und reichen sie an tar weiter. Tar entpackt die
Dateien umgehend.
irgendein.computer.net $ netcat -l -p 1234 | tar xv
Hier steht x für extract und v für verbose. Letztere
steht für ausführlichere Ausgaben, was tar eigentlich macht. So seht ihr, wie
die Dateien entpackt werden. Das macht aber den ganzen Geschwindigkeitsvorteil
zugrunde, daher begnügt Euch mit "... | tar x".
Noch ein letztes Wort zu netcats Minimalismus. Da es so schlicht ist, kennt es selbstverstädlich auch keine Verschlüßelung oder ähnlichen schnickschnack. Daher solltet ihr es auch nur in sicheren, also eigenen Netzen mit ausschließlich vertrauenswürdigen TeilnehmerInnen benutzen, oder für Daten die sowieso öffentlich sind (etwa Filme, Musik usw.).
Und wer mal wissen will, wie schnell Netcat ist, hier einige Vergleichswerte:
| 100MB Zip | 52MB Ogg, m3u | 69MB /usr/share/doc | |
|---|---|---|---|
| netcat | 22s | 19s | 44s |
| scp | 48s | 36s / 32s* | 1m11s / 40s** |
| rsync | 50s | 32s | 2m9s |
| http | 22s | - | - |
* mit Kompression (scp -C)
** mit Hilfe von tar
Kommentare:
Wenn dir netcat gut gefällt, dann gucke dir mal socat an. Hier ein paar Beispiele:
http://www.dest-unreach.org/socat/doc/socat.html#EXAMPLES
Geschrieben von fukami (Mon Mar 5 21:50:03 2007)
Braucht aber immer Übereinkunft der beiden Peers. HTTP mit einem minimalen Server wär doch da viel cooler, wie heissen die coolen WebDAV-T00lz? Bislang ist da FTP das Mittel der Wahl, aber das Protkoll ist unhandlich.
Geschrieben von Astro (Mon Mar 5 23:19:17 2007)
Ah, so hattest du dir das also vorgestellt. Sehr cool.
Danke fuer die Daten via "Bote", mein Stress hat sich nach (erfolgreicher) Pruefung deutllich gelegt. :)
Geschrieben von linse (Tue Mar 6 09:44:08 2007)
für solche aktionen würde ich immer scp -c blowfish empfehlen, oder gleich den klassiker:
tar cvf - dir/ | buffer | ssh -e none -c blowfish user@host "cd /path/to/dest/ && buffer | tar xvf -"
buffer kann man auch weglassen, wenn man möchte...
Geschrieben von Igor (Tue Mar 6 10:41:32 2007)

prometoys@jwchat.org
Saturn