최근에 QNX 설명서에서 직렬 장치 ( dev/serX
) 를 사용하여 별도의 물리적 시스템에서 프로세스간에 메시지 기반 IPC를 설정할 수 있다는 사실을 발견했습니다 .
Linux에서 TCP / UDP 터널을위한 시스템 전체의 특수 장치를 만들 수 있습니까? nc
stdin / stdout 과 같은 것이 / dev / something에 공개적으로 노출되었습니다.
결국 나는 한 컴퓨터에서 그러한 파일에 무언가를 쓰고 다른 쪽 끝에받을 수 있기를 원합니다.
#machine1:
echo "Hello" > /dev/somedev
#machine2:
cat < /dev/somedev
나는 nc
남자를 보았지만 stdio 이외의 io 소스 / 대상을 지정하는 옵션을 찾지 못했습니다.
답변
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 와 같은 것을 사용할 수 있습니다.
( socat ssl 에 대한 추가 정보 )
답변
메시지 전달은 상위 계층에서 구현해야합니다. 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
.
답변
nc와 같은 기본 프로그램을 사용하여 두 대의 컴퓨터를 단순히 연결하려면 /에서 리디렉션 할 수 있습니다 /dev/tcp/<host>/<port>
.
이들은 실제 장치가 아니라 bash가 만든 소설이므로 cat /dev/tcp/foo/19
작동하지 않지만 작동 cat < /dev/tcp/foo/19
합니다.