socat
dapat melakukan ini dan banyak hal lainnya dengan hal-hal yang menyerupai "aliran"
Sesuatu yang menggunakan ide dasar ini seharusnya melakukannya untuk Anda:
Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave
Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321
(diadaptasi dari Halaman Contoh)
Jika Anda ingin mengenkripsi, Anda dapat menggunakan variasi ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork
di mesin1, dan sesuatu seperti ssl:server-host:1443,cert=client.pem,cafile=server.crt
di mesin2
(Selengkapnya tentang socat ssl)
Penyampaian pesan perlu diimplementasikan pada lapisan yang lebih tinggi; TCP tidak memiliki gagasan tentang pesan -- koneksi TCP mentransfer aliran oktet.
Anda dapat mencapai sesuatu seperti yang Anda minta dengan nc
dan pipa bernama, lihat man mkfifo
; atau centang socat
seperti yang ditunjukkan oleh Alex Stragies.
Tanpa layanan lapisan tengah, masalah dasarnya adalah (1) bahwa data tidak dapat ditulis ke jaringan kecuali ada seseorang di sisi lain yang mendengarkannya, dan (2) bahwa koneksi TCP bersifat dua arah.
Karena Anda tidak dapat menulis data ke jaringan kecuali seseorang sedang mendengarkannya, Anda harus selalu memulai pendengar sebelum Anda dapat mengirim data. (Dalam sistem pengiriman pesan, proses yang menangani pesan akan menyediakan semacam buffering.)
Contoh Anda dapat dengan mudah ditulis ulang:
-
Pertama, mulai pendengar di mesin2 (tujuan):
nc -l 1234 | ...some processing with the received data...
Dalam contoh Anda, ini akan menjadi
nc -l 1234 | cat
Ini akan memblokir dan menunggu seseorang mengirim beberapa data ke port 1234.
-
Kemudian Anda dapat mengirim beberapa data dari machine1 (sumber):
...make up some data... | nc machine2 1234
Dalam contoh Anda, ini akan menjadi
echo "Hello" | nc machine2 1234
Jika Anda ingin memproses data yang diterima dengan cara tertentu dan merespons, Anda dapat menggunakan fasilitas coprocessing dari shell. Misalnya, ini adalah server web yang sangat sederhana (dan sangat keras kepala):
#! /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
Lihat bagaimana komunikasi dua arah dicapai antara badan utama skrip dan koproses menggunakan deskriptor file dalam larik $ncfd
.
Jika Anda hanya ingin menghubungkan dua komputer menggunakan program dasar seperti nc, Anda dapat mengalihkan dari/ke /dev/tcp/<host>/<port>
.
Ini bukan perangkat sebenarnya tetapi fiksi yang dibuat oleh bash, jadi hal-hal seperti cat /dev/tcp/foo/19
tidak akan berfungsi, tetapi cat < /dev/tcp/foo/19
akan.