GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile esporre il tunnel TCP in Linux come dispositivo a caratteri speciali?

socat può fare questo e molte altre cose con cose che assomigliano a "stream"

Qualcosa che utilizzi questa idea di base dovrebbe farlo per te:

Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave

Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321

(adattato dalla pagina degli esempi)

Se vuoi crittografare, puoi usare una variazione di ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork sulla macchina1 e qualcosa come ssl:server-host:1443,cert=client.pem,cafile=server.crt sulla macchina2

(Ulteriori informazioni su socat ssl)


Il passaggio di messaggi deve essere implementato a un livello superiore; TCP non ha una nozione di messaggio -- le connessioni TCP trasferiscono flussi di ottetti.

Puoi ottenere qualcosa di simile a quello che richiedi con nc e named pipe, vedi man mkfifo; oppure seleziona socat come indica Alex Stragies.

Senza un servizio di livello intermedio, i problemi di base sono (1) che i dati non possono essere scritti sulla rete a meno che non ci sia qualcuno all'altro capo ad ascoltarli e (2) che le connessioni TCP sono bidirezionali.

Poiché non puoi scrivere dati sulla rete a meno che qualcuno non li stia ascoltando, devi sempre avviare il listener prima puoi inviare i dati (In un sistema di passaggio di messaggi il processo che gestisce i messaggi fornirà una sorta di buffering.)

Il tuo esempio può essere facilmente riscritto:

  • Per prima cosa avvia un listener sulla macchina2 (la destinazione):

     nc -l 1234 | ...some processing with the received data...
    

    Nel tuo esempio, questo sarebbe

     nc -l 1234 | cat
    

    Questo bloccherà e attenderà che qualcuno invii dei dati alla porta 1234.

  • Quindi puoi inviare alcuni dati dalla macchina1 (la fonte):

    ...make up some data... | nc machine2 1234
    

    Nel tuo esempio, questo sarebbe

     echo "Hello" | nc machine2 1234
    

Se si desidera elaborare in qualche modo i dati ricevuti e rispondere, è possibile utilizzare la funzione di coprocessing della shell. Ad esempio, questo è un server web molto semplice (e molto ostinato):

#! /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

Guarda come si ottiene la comunicazione bidirezionale tra il corpo principale dello script e il coprocesso utilizzando i descrittori di file nell'array $ncfd .


Se vuoi semplicemente connettere due computer usando un programma di base come nc puoi reindirizzare da/a /dev/tcp/<host>/<port> .

Questi non sono dispositivi reali ma una finzione creata da bash, quindi cose come cat /dev/tcp/foo/19 non funzionerà, ma cat < /dev/tcp/foo/19 lo farà.


Linux
  1. Linux – Sysfs e Devtmpfs?

  2. Comando eco di Linux

  3. È possibile interrompere l'arresto su Linux?

  4. Possibile utilizzare un .dll su Linux

  5. Controllo di un alimentatore USB (on/off) con Linux

Comando Echo in Linux (con esempi)

16 Esempi di comandi Echo in Linux

Echo Command in Linux con esempi

Tutto è file in Linux – Parte 1

Linux Mint KDE è ancora possibile

Come montare un dispositivo in Linux?