stdin 및 stdout을 포트로 리디렉션


10

나는 프로그램 싶네요 Pstdin&에 쓰기를 stdout, 그러나에 연결 nc이 다른 포트로 특정 포트와 출력에서 읽이든 같은.

# The reading is easy, here P reads from port 50505
nc -l 50505 | P

포트 60606으로 다시 쓰려면 어떻게해야합니까?


귀하의 질문은 명확하지 않습니다. 당신은 누군가가 당신의 컴퓨터에 하나의 포트 50505와 다른 하나의 포트 50506에 2 개의 TCP 커넥션을 열어서 첫 번째 포트에 데이터를 보내고 두 번째 TCP 커넥션 P의 출력을 읽을 것으로 예상 P합니까? 왜 UDP 태그입니까?
Stéphane Chazelas

예! 까지는 UDP원한다고 생각 ports하지만 기존 키워드가 아니기 때문에 생각 TCP하고 UDP반사를 추가했다고 생각 합니다.
Yimin Rong

답변:


12

나는 누군가가 당신의 컴퓨터에 2 개의 TCP 연결을 열 수 있고, 하나는 포트 50505에, 다른 하나는 포트 60606에 연결하고, 첫 번째 포트에 데이터를 보내 P로 공급되고 두 번째 TCP 연결에서 P의 출력을 읽을 것으로 예상합니다. 그때는 다음과 같습니다.

< /dev/null nc -q -1 -l 50505 | P | nc -l 60606 > /dev/null

또는과 socat:

socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr

들어 P동일한 연결에 그 출력 등을 보내 :

socat tcp-listen:50505,reuseaddr exec:P

3

nc포트를 사용하기 위해 필요하지 않습니다 . bash그 자체를 할 수 있습니다 :

Bash는 다음 표에 설명 된 것처럼 리디렉션에 사용될 때 여러 파일 이름을 특별히 처리합니다.

/dev/fd/fd
    If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
    File descriptor 0 is duplicated.
/dev/stdout
    File descriptor 1 is duplicated.
/dev/stderr
    File descriptor 2 is duplicated.
/dev/tcp/host/port
   If host is a valid hostname or Internet address, and port is an integer 
   port number or service name, bash attempts to open a TCP connection to
   the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer 
    port number or service name, bash attempts to open a UDP connection to
    the corresponding socket.

3
/dev/tcp종종 사용 중지되어 청취에 사용할 수 없습니다 . zsh청취 tcp 소켓을 작성할 수있는 쉘이 필요한 경우에 필요 합니다.
Stéphane Chazelas

@ StéphaneChazelas 나는 결코 시도하지 않았다는 것을 인정해야합니다. 맨 페이지에서이 제한에 대해 아무 말도하지 않습니까?
Hauke ​​Laging 2018

어떻게 하시겠습니까? 리스너 소켓은 더 많은 수용 소켓을 만드는 문이며 리디렉션은 그다지 효과적이지 않습니다. zsh는이를 위해 빌트인을 사용합니다 ( 리스닝 소켓에서 ztcp -l청취 및 ztcp -a연결 을 수신 하기 위해).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.