최근 QNX 문서에서 직렬 장치()를 사용하여 별도의 물리적 시스템에 있는 프로세스 간에 메시지 기반 IPC를 설정할 수 있다는 사실을 발견했는데, dev/serX
이것이 궁금했습니다.
Linux에서 TCP/UDP 터널링을 위한 시스템 전체의 특수 장치를 만드는 것이 가능합니까? stdin/stdout 과 같은 것들은 nc
/dev/something 아래에 공개적으로 노출됩니다.
궁극적으로 나는 한 컴퓨터에서 그러한 파일에 무언가를 쓰고 다른 쪽 끝에서 이를 받을 수 있기를 원합니다. 예를 들면 다음과 같습니다.
#machine1:
echo "Hello" > /dev/somedev
#machine2:
cat < /dev/somedev
나는 man을 보았지만 nc
stdio 이외의 io 소스/대상을 지정하는 옵션을 찾지 못했습니다.
답변1
socat
"스트림"과 같은 것을 사용하면 이 작업과 다른 많은 작업을 수행할 수 있습니다.
이 기본 아이디어를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave
Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321
(에서 적응샘플 페이지)
암호화를 원하면 ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork
machine1에서 변형을 사용할 수 있고 ssl:server-host:1443,cert=client.pem,cafile=server.crt
machine2에서는 이와 같은 것을 사용할 수 있습니다.
(자세한 내용은소카트 SSL)
답변2
메시지 전달은 상위 계층에서 구현되어야 합니다. TCP에는 메시지 개념이 없습니다. TCP 연결은 옥텟 스트림을 전달합니다.
요청한 것과 유사한 것을 구현할 수 nc
있으며명명된 파이프, 시청 man mkfifo
하거나 socat
Alex Stragies의 지시에 따라 확인해 보세요.
중간 계층 서비스가 없으면 기본적인 문제는 (1) 누군가 상대방에서 수신하지 않는 한 네트워크에 데이터를 쓸 수 없다는 것과 (2) TCP 연결이 양방향이라는 것입니다.
누군가 듣고 있지 않으면 네트워크에 데이터를 쓸 수 없기 때문에 항상 수신기를 시작해야 합니다.앞으로데이터를 보낼 수 있습니다. (메시징 시스템에서 메시지를 처리하는 프로세스는 일종의 버퍼링을 제공합니다.)
귀하의 예는 쉽게 다시 작성할 수 있습니다.
먼저 machine2(대상)에서 리스너를 시작합니다.
nc -l 1234 | ...some processing with the received data...
귀하의 예에서 이것은
nc -l 1234 | cat
이렇게 하면 누군가가 포트 1234로 일부 데이터를 보낼 때까지 차단되고 기다립니다.
그런 다음 machine1(소스)에서 일부 데이터를 보낼 수 있습니다.
...make up some data... | nc machine2 1234
귀하의 예에서 이것은
echo "Hello" | nc machine2 1234
수신된 데이터를 처리하고 어떤 방식으로든 응답하려면 셸의 공동 처리 기능을 사용할 수 있습니다. 예를 들어, 다음은 매우 단순하고 완고한 웹 서버입니다.
#! /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
배열에서 파일 설명자를 사용하여 스크립트 본문과 공동 프로세스 간의 양방향 통신을 구현하는 방법을 알아보세요 $ncfd
.
답변3
nc와 같은 기본 프로그램을 사용하여 두 대의 컴퓨터를 연결하려는 경우 에서/로 리디렉션할 수 있습니다 /dev/tcp/<host>/<port>
.
이는 실제 장치가 아니라 bash에 의해 생성된 가상의 장치이므로 이와 유사한 것은 cat /dev/tcp/foo/19
작동하지 않지만 cat < /dev/tcp/foo/19
작동할 것입니다.