Kürzlich habe ich in der QNX-Dokumentation festgestellt, dass es das Einrichten eines nachrichtenbasierten IPC zwischen Prozessen auf separaten physischen Computern mithilfe des seriellen Geräts ( dev/serX
) ermöglicht, und ich habe mich gefragt:
Ist es unter Linux möglich, ein systemweites Spezialgerät für den TCP / UDP-Tunnel zu erstellen? So etwas wie nc
stdin / stdout wird öffentlich unter / dev / Something veröffentlicht .
Am Ende möchte ich in der Lage sein, etwas in eine solche Datei auf einem Computer zu schreiben und es am anderen Ende zu empfangen, zum Beispiel:
#machine1:
echo "Hello" > /dev/somedev
#machine2:
cat < /dev/somedev
Ich habe mir den nc
Mann angesehen, aber keine andere Option gefunden, um eine andere Quelle / ein anderes Ziel als stdio anzugeben.
Antworten:
socat
kann dies und viele andere Dinge mit Dingen tun, die "Streams" ähnelnEtwas, das diese Grundidee verwendet, sollte es für Sie tun:
(angepasst von der Beispielseite )
Wenn Sie verschlüsseln möchten, können Sie eine Variation von
ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork
auf Maschine1 und so etwas wiessl:server-host:1443,cert=client.pem,cafile=server.crt
auf Maschine2 verwenden(Mehr über socat ssl )
quelle
Das Weiterleiten von Nachrichten muss auf einer höheren Ebene implementiert werden. TCP hat keine Vorstellung von einer Nachricht - die TCP-Verbindungen übertragen Oktettströme.
Sie können so etwas wie das erreichen, was Sie mit
nc
und benannten Pipes anfordern , sieheman mkfifo
; oder überprüfen Sie,socat
wie Alex Stragies angibt.Ohne einen Middle-Layer-Dienst bestehen die Grundprobleme darin, (1) dass Daten nur dann in das Netzwerk geschrieben werden können, wenn jemand am anderen Ende darauf wartet, und (2) dass TCP-Verbindungen bidirektional sind.
Da Sie keine Daten in das Netzwerk schreiben können, ohne dass jemand darauf wartet, müssen Sie den Listener immer starten, bevor Sie Daten senden können. (In einem Nachrichtenübermittlungssystem stellt der Prozess, der die Nachrichten verarbeitet, eine Art Pufferung bereit.)
Ihr Beispiel kann einfach umgeschrieben werden:
Starten Sie zuerst einen Listener auf Maschine2 (dem Ziel):
In Ihrem Beispiel wäre dies
Dies blockiert und wartet darauf, dass jemand Daten an Port 1234 sendet.
Dann können Sie einige Daten von Maschine1 (der Quelle) senden:
In Ihrem Beispiel wäre dies
Wenn Sie die empfangenen Daten auf irgendeine Weise verarbeiten und antworten möchten, können Sie die Coprozessierungsfunktion der Shell verwenden. Dies ist beispielsweise ein sehr einfacher (und sehr hartnäckiger) Webserver:
Sehen Sie anhand der Dateideskriptoren im Array, wie die bidirektionale Kommunikation zwischen dem Hauptteil des Skripts und dem Coprozess erreicht wird
$ncfd
.quelle
cat
steht für "einige Prozesslesungen für stdin".Wenn Sie einfach zwei Computer mit einem Basisprogramm wie nc verbinden möchten, können Sie von / nach umleiten
/dev/tcp/<host>/<port>
.Dies sind keine tatsächlichen Geräte, sondern eine Fiktion, die durch Bash erstellt wurde. Dinge wie
cat /dev/tcp/foo/19
funktionieren also nicht, werden es abercat < /dev/tcp/foo/19
.quelle