Oftmals befindet man sich in der Situation, Dateien schnell von einem Rechner zu
einem anderen zu kopieren und es sind gerade keine SSH-Keys vorhanden, oder
nicht bei dem verwendeten Benutzer hinterlegt. Ebenso ist es manchmal nützlich,
schnell einen Server auf einem gewissen Port zu starten oder eine Verbindung
aufzubauen, wenn beispielsweise curl
gerade nicht zur Hand ist.
Deshalb möchte ich ein absolut unerlässliches Werkzeug vorstellen, das alle diese Aufgaben erledigen kann: Netcat.
“The Swiss-army knife for TCP/IP”
Netcat ist ein Kommandozeilenprogramm, das auf Netzwerk- oder
Unix-Domain-Sockets mittels TCP oder UDP schreiben und von ihnen lesen kann. Es
wurde ursprünglich für unixoide Betriebssysteme entwickelt, ist aber inzwischen
auf der Windows-Plattform verfügbar. Ein- und Ausgaben werden über STDIN
und STDOUT
realisiert, so dass es wie alle Unix-Kommandozeilen-Tools leicht in
Shell-Skripten verwendet werden kann.
Beispiele
Der Aufruf von Netcat variiert je nach verwendetem Betriebssystem; unter Linux
in der Regel mit netcat
, unter BSD und dessen Abkömmlingen (Mac OS X als
prominentesten Vertreter) durch nc
. Ebenfalls sind die Aufrufparameter
leicht unterschiedlich (unter Linux verlangt -l
zwingend -p
).
Ich beschränke mich im Folgenden auf OSX.
Dateien kopieren
Auf dem Zielhost B wird Netcat im Listening-Modus gestartet (es wird
standardmäßig TCP verwendet), z. B. auf Port 12500. Ich möchte ein Verzeichnis
foo
vom Host A nun auf den Host B ins Verzeichnis bar
übertragen:
Host B:
$ nc -l 12500 | tar -C bar -xvf -
Host A:
$ tar cvz - foo | nc host-b.example.com 12500
Remote-Syslogging testen
Wir wollten gerade die Funktionalität von logging-remote-syslog testen, hatten jedoch keinen konfigurierten Syslog-Dienst zur Hand, der Remote-Logging erlaubt. Das kann man jedoch zu Testzwecken problemlos mit Netcat erledigen, Syslog verwendet UDP auf Port 594.
Zunächst das kurze Ruby-Skript:
# encoding: utf-8
require 'rubygems'
require 'logging'
require 'logging/remote-syslog'
host = 'localhost'
port = '594'
logger = Logging.logger['MyApp']
logger.add_appenders(
Logging.appenders.remote_syslog("Netcat", syslog_server: host, port: port)
)
logger.level = :info
logger.info 'Hello, Netcat!'
und der Netcat-Syslog-Server (Der sudo
-Aufruf ist notwendig, da die ersten
1024 Ports privilegiert sind):
$ sudo nc -u -l 594
<14>Jun 7 15:49:46 flo2.s5.nix-wie-weg.de Netcat: INFO MyApp : Hello, Netcat!
Einfache Clients implementieren
Eine HTTP/1.0 GET-Anfrage (bei HTTP/1.1 wäre der Host-Header noch zu setzen):
$ printf "GET / HTTP/1.0\r\n\r\n" | nc www.google.com 80
HTTP/1.0 302 Found
Location: http://www.google.de/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
...
Analog dazu kann man auch bequem E-Mails mit Netcat versenden (SMTP, Port 25).
Netcat als Portscanner
Um nach laufenden Diensten in einer gewissen Port-Range zu suchen, kann Netcat so gestartet werden:
$ nc -z www.nix-wie-weg.de 80-88
Connection to www.nix-wie-weg.de 80 port [tcp/http] succeeded!
Weiterführende Links
Die vorgestellten Beispiel waren nur ein grober Überblick über die möglichen Anwendungsszenarien. Viele weitere Beispiele und eine ausführliche Dokumentation kann man an folgenden Stellen erhalten: