socat
může dělat toto a mnoho dalších věcí s věcmi připomínajícími „proudy“
Něco využívající tuto základní myšlenku by to mělo udělat za vás:
Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave
Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321
(převzato ze stránky Příklady)
Pokud chcete šifrovat, můžete použít variantu ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork
na stroji1 a něco jako ssl:server-host:1443,cert=client.pem,cafile=server.crt
na stroji2
(Více o socat ssl)
Předávání zpráv musí být implementováno na vyšší vrstvě; TCP nemá pojem zprávy -- TCP spojení přenášejí proudy oktetů.
Pomocí nc
můžete dosáhnout něčeho podobného, co požadujete a pojmenované kanály, viz man mkfifo
; nebo zaškrtněte socat
jak naznačuje Alex Stragies.
Bez služby střední vrstvy jsou základní problémy (1) že data nelze zapisovat do sítě, pokud je někdo na druhém konci neposlouchá, a (2) že TCP spojení jsou obousměrná.
Protože nemůžete zapisovat data do sítě, pokud je někdo neposlouchá, musíte posluchače vždy spustit před můžete odesílat data. (V systému předávání zpráv bude proces zpracovávající zprávy poskytovat určitý druh ukládání do vyrovnávací paměti.)
Váš příklad lze snadno přepsat:
-
Nejprve spusťte posluchače na počítači2 (cíl):
nc -l 1234 | ...some processing with the received data...
Ve vašem příkladu by to bylo
nc -l 1234 | cat
Tím se zablokuje a počká, až někdo pošle nějaká data na port 1234.
-
Poté můžete odeslat některá data ze stroje1 (zdroj):
...make up some data... | nc machine2 1234
Ve vašem příkladu by to bylo
echo "Hello" | nc machine2 1234
Pokud chcete přijatá data nějakým způsobem zpracovat a odpovědět, můžete použít koprocesní zařízení shellu. Toto je například velmi jednoduchý (a velmi tvrdohlavý) webový server:
#! /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
Podívejte se, jak je dosaženo obousměrné komunikace mezi hlavní částí skriptu a koprocesem pomocí deskriptorů souborů v poli $ncfd
.
Pokud chcete jednoduše propojit dva počítače pomocí základního programu, jako je nc, můžete přesměrovat z/do /dev/tcp/<host>/<port>
.
Toto nejsou skutečná zařízení, ale fikce vytvořená bash, takže věci jako cat /dev/tcp/foo/19
nebude fungovat, ale cat < /dev/tcp/foo/19
bude.