Linux에서 TCP 문자를 특수 문자 장치로 노출 할 수 있습니까?


10

최근에 QNX 설명서에서 직렬 장치 ( dev/serX) 를 사용하여 별도의 물리적 시스템에서 프로세스간에 메시지 기반 IPC를 설정할 수 있다는 사실을 발견했습니다 .

Linux에서 TCP / UDP 터널을위한 시스템 전체의 특수 장치를 만들 수 있습니까? ncstdin / stdout 과 같은 것이 / dev / something에 공개적으로 노출되었습니다.

결국 나는 한 컴퓨터에서 그러한 파일에 무언가를 쓰고 다른 쪽 끝에받을 수 있기를 원합니다.

#machine1:
echo "Hello" > /dev/somedev

#machine2:
cat < /dev/somedev

나는 nc남자를 보았지만 stdio 이외의 io 소스 / 대상을 지정하는 옵션을 찾지 못했습니다.



1
좋은 언급 : tun / tap 장치는 / dev에서 만들 수 있지만 직접 IP 캡슐화를 수행해야합니다. 일부 목적에 매우 유용합니다.
pjc50

답변:


19

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,forkmachine1 의 변형을 사용하고 ssl:server-host:1443,cert=client.pem,cafile=server.crtmachine2 와 같은 것을 사용할 수 있습니다.

( socat ssl 에 대한 추가 정보 )


7

메시지 전달은 상위 계층에서 구현해야합니다. TCP에는 메시지 개념이 없습니다. TCP 연결은 옥텟 스트림을 전송합니다.

당신은 당신이 요청하는 것 같은 정렬의 뭔가 얻을 수 있습니다 nc명명 된 파이프 , 참조 man mkfifo; 또는 socatAlex 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.


당신이 옳습니다. 나는 그 대답에서 그것을 인정했습니다. 중재 소프트웨어가 없으면 문자 장치를 사용할 수 없습니다.
AlexP

UUOC가있는 것 같습니다.
Michael Hampton

1
@MichaelHampton : OP가 제공 한 예입니다. cat"stdin에 대한 일부 프로세스 읽기" 를 의미 한다고 가정합니다 .
AlexP

5

nc와 같은 기본 프로그램을 사용하여 두 대의 컴퓨터를 단순히 연결하려면 /에서 리디렉션 할 수 있습니다 /dev/tcp/<host>/<port>.

이들은 실제 장치가 아니라 bash가 만든 소설이므로 cat /dev/tcp/foo/19작동하지 않지만 작동 cat < /dev/tcp/foo/19합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.