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à.