Mit script & netcat Shellausgaben teilen

In diesem Blogpost möchte ich ein einfaches Kommandozeilen-Setup vorstellen, mit dem ihr eure Shellausgaben live übertragen könnt. Wir werden dabei nur die Standard-Tools: mkfifo, script, bash & netcat werden.

Die Tools

Das Programm „script“

Script ist ein kleines Programm, welches eine Subshell spawnt, in der es alle graphischen Ein- bzw. Ausgaben in eine Datei oder ein Fifo schreibt. Dabei werden alle Kontrollsequenzen mitgeschrieben, sodass keine Informationen verloren gehen. Das ist u.a. nützlich, wenn man seine Aktionen auf der Kommandozeile protokollieren möchte.

Das Programm „netcat“

Netcat ist ein weiteres Tool, mit dem man Server-Dienste ansprechen bzw. selbst bereitstellen kann.

Das Setup

Wir unterscheiden das Setup in Server (Anbieter der Shell) und Client (Zuschauer).

Der Server

Auf dem System, auf dem die Shell geteilt werden soll, führen wir folgende drei Befehle aus:

mkfifo /tmp/sharedshell

Damit erstellen wir eine spezielle Datei, welche sich wie eine First-In-First-Out (FIFO) Pipe verhält.

while true; do cat /tmp/sharedshell | nc -l -p 8088; done &

Mit diesem Befehl lesen wir aus unserem FIFO-File und schicken die Ausgabe an einen Socket auf Port 8088. Jetzt müssen wir nur noch in unsere FIFO-Datei Daten reinschreiben:

script -f /tmp/sharedshell

Das startet eine Subshell und schreibt alle Ein-/Ausgaben in die FIFO-Datei. Möchte man temporär eine andere Shell nutzen, so führt man folgendes Kommando aus:

SHELL=/usr/bin/bash script -f /tmp/sharedshell

Der Client

Unter der Voraussetzung, das der beim Netcat angegebene Port von außen erreichbar ist, kann sich der Zuschauer einfach verbinden:

nc IP PORT
  • IP : IP des Hosts
  • PORT: Port auf dem netcat lauscht (hier: 8088)

Ist die Verbindung hergestellt, so werden die Ein- bzw. Ausgaben des Servers dargestellt. Leider kann Netcat maximal eine Verbindung gleichzeitig annehmen, sodass die Anzahl der Zuschauer auf 1 begrenzt ist. Für kurze Screen-Übermittlungen sollte das jedoch ausreichen.

~ Sebastian