GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ist es möglich, TCP-Tunnel in Linux als Sonderzeichengerät verfügbar zu machen?

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.


Linux
  1. Linux – Sysfs und Devtmpfs?

  2. Was sind spezielle Zeichen- und Blockierungsdateien in einem Unix-System?

  3. Linux – Datenwiederherstellung nach dem Kopieren der Datei auf das Blockgerät?

  4. Linux-Echo-Befehl

  5. Steuern einer USB-Stromversorgung (ein/aus) mit Linux

So installieren Sie einen Gerätetreiber unter Linux

Echo-Befehl in Linux (mit Beispielen)

16 Beispiele für Echo-Befehle unter Linux

Echo-Befehl in Linux mit Beispielen

Unter Linux ist alles eine Datei – Teil 1

Linux Mint KDE noch möglich