Niedawno odkryłem w dokumentacji QNX, że pozwala ona konfigurować IPC oparty na komunikatach między procesami na osobnych maszynach fizycznych za pomocą serial device ( dev/serX
) i zastanawiałem się:
Czy w Linuksie jest możliwe stworzenie ogólnosystemowego specjalnego urządzenia dla tunelu TCP / UDP? Coś takiego jak nc
stdin / stdout publicznie ujawnione pod / dev / coś.
Na koniec chciałbym móc napisać coś do takiego pliku na jednym komputerze i otrzymać to na drugim końcu, na przykład:
#machine1:
echo "Hello" > /dev/somedev
#machine2:
cat < /dev/somedev
Spojrzałem na nc
człowieka, ale nie znalazłem żadnej opcji, aby określić źródło / miejsce docelowe inne niż stdio.
Odpowiedzi:
socat
potrafi to zrobić i wiele innych rzeczy przypominających „strumienie”Coś wykorzystującego ten podstawowy pomysł powinno zrobić to za Ciebie:
(dostosowany ze strony przykładów )
Jeśli chcesz zaszyfrować, możesz użyć wariacji
ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork
na maszynie1 i czegoś takiego jakssl:server-host:1443,cert=client.pem,cafile=server.crt
na maszynie2(Więcej o socat ssl )
źródło
Przekazywanie wiadomości musi być realizowane na wyższej warstwie; TCP nie ma pojęcia wiadomości - połączenia TCP przesyłają strumienie oktetów.
Możesz osiągnąć coś w rodzaju żądanej nazwy
nc
i potoku nazwanego , zobaczman mkfifo
; lub sprawdź,socat
jak wskazuje Alex Stragies.Bez usługi warstwy pośredniej podstawowymi problemami są (1) to, że danych nie można zapisać do sieci, chyba że ktoś na drugim końcu ich oczekuje i (2) że połączenia TCP są dwukierunkowe.
Ponieważ nie można zapisywać danych w sieci, chyba że ktoś ich słucha, zawsze należy uruchomić detektor, zanim będzie można wysłać dane. (W systemie przekazywania komunikatów proces obsługi komunikatów zapewni pewnego rodzaju buforowanie).
Twój przykład można łatwo przepisać:
Najpierw uruchom detektor na maszynie2 (miejsce docelowe):
W twoim przykładzie byłoby to
Spowoduje to zablokowanie i poczekanie, aż ktoś wyśle jakieś dane do portu 1234.
Następnie możesz wysłać niektóre dane z maszyny1 (źródło):
W twoim przykładzie byłoby to
Jeśli chcesz w jakiś sposób przetworzyć otrzymane dane i odpowiedzieć, możesz skorzystać z funkcji koprocesowania powłoki. Na przykład jest to bardzo prosty (i bardzo uparty) serwer WWW:
Zobacz, w jaki sposób osiągnięto dwukierunkową komunikację między główną treścią skryptu a koprocesem za pomocą deskryptorów plików w tablicy
$ncfd
.źródło
cat
oznacza „jakiś proces odczytu standardowego”.Jeśli chcesz po prostu połączyć dwa komputery za pomocą podstawowego programu, takiego jak nc, możesz przekierować z / do
/dev/tcp/<host>/<port>
.To nie są rzeczywiste urządzenia, ale fikcja stworzona przez bash, więc rzeczy takie jak
cat /dev/tcp/foo/19
nie będą działać, alecat < /dev/tcp/foo/19
będą.źródło