socat
kann dies und viele andere Dinge mit Dingen tun, die "Streams" ähneln
Etwas, das diese Grundidee verwendet, sollte es für Sie tun:
Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave
Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321
(angepasst von Beispielseite)
Wenn Sie verschlüsseln möchten, können Sie eine Variante von ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork
verwenden auf machine1 und so etwas wie ssl:server-host:1443,cert=client.pem,cafile=server.crt
auf Maschine2
(Mehr über socat ssl)
Message-Passing muss auf einer höheren Ebene implementiert werden; TCP hat keine Vorstellung von einer Nachricht – die TCP-Verbindungen übertragen Ströme von Oktetten.
Mit nc
können Sie so etwas wie das erreichen, was Sie anfordern und Named Pipes, siehe man mkfifo
; oder überprüfen Sie socat
wie Alex Stragies angibt.
Ohne einen Dienst der mittleren Ebene bestehen die grundlegenden Probleme darin, (1) dass Daten nicht in das Netzwerk geschrieben werden können, es sei denn, jemand am anderen Ende hört darauf zu, und (2) dass TCP-Verbindungen bidirektional sind.
Da Sie keine Daten in das Netzwerk schreiben können, es sei denn, jemand lauscht darauf, müssen Sie den Listener immer vorher starten Sie können Daten senden. (In einem Message-Passing-System wird der Prozess, der die Nachrichten handhabt, eine Art Pufferung bereitstellen.)
Ihr Beispiel kann leicht umgeschrieben werden:
-
Starten Sie zuerst einen Listener auf Maschine2 (dem Ziel):
nc -l 1234 | ...some processing with the received data...
In Ihrem Beispiel wäre dies
nc -l 1234 | cat
Dies blockiert und wartet darauf, dass jemand Daten an Port 1234 sendet.
-
Dann können Sie einige Daten von Maschine1 (der Quelle) senden:
...make up some data... | nc machine2 1234
In Ihrem Beispiel wäre dies
echo "Hello" | nc machine2 1234
Wenn Sie die empfangenen Daten auf irgendeine Weise verarbeiten und darauf antworten möchten, können Sie die Coprocessing-Funktion der Shell verwenden. Dies ist zum Beispiel ein sehr einfacher (und sehr hartnäckiger) Webserver:
#! /bin/bash
while :; do
coproc ncfd { nc -l 1234; }
while :; do
read line <&${ncfd[0]} || break
line="$(
echo "$line" |
LC_ALL=C tr -cd ' -~'
)"
echo >&2 "Received: \"$line\""
if [ "$line" = "" ]; then
echo >&${ncfd[1]} "HTTP/1.0 200 OK"
echo >&${ncfd[1]} "Content-Type: text/html"
echo >&${ncfd[1]} "Connection: close"
echo >&${ncfd[1]} ""
echo >&${ncfd[1]} "<title>It works!</title>"
echo >&${ncfd[1]} "<center><b>It works!</b></center>"
echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
break
fi
done
kill %%
sleep 0.1
done
Sehen Sie, wie die bidirektionale Kommunikation zwischen dem Hauptteil des Skripts und dem Koprozess mithilfe der Dateideskriptoren im Array $ncfd
erreicht wird .
Wenn Sie einfach zwei Computer mit einem einfachen Programm wie nc verbinden möchten, können Sie von/auf /dev/tcp/<host>/<port>
umleiten .
Dies sind keine tatsächlichen Geräte, sondern eine von bash erstellte Fiktion, also Dinge wie cat /dev/tcp/foo/19
funktioniert nicht, aber cat < /dev/tcp/foo/19
wird.