파이핑 및 UDP의 Netcat / socat 동작? 5000 hello hello hello ^C … 그리고 서버 터미널로

나는이 가까운 것 같다 netcat을가 UDP 트래픽을 수신 중지 – – 리눅스 슈퍼 사용자 ,하지만 난 더 나은 어쨌든 물어 줄 알았는데

netcat 버전 까지는 Ubuntu 11.04와 그 기본값 netcat을 사용하고 있습니다 openbsd.

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

이것은 내가 이상하게 생각하는 것입니다. 첫 번째 경우는 예상대로 작동합니다. 한 터미널에서 UDP 서버를 엽니 다.

$ sudo nc -ul 5000

… 그리고 다른 터미널에서 새로운 UDP 클라이언트 연결을 시작합니다. 그리고 hello세 번 입력 한 후 Enter 키를 누릅니다.

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

… 그리고 서버 터미널로 돌아가서 hello예상대로 세 번 인쇄 되었습니다.

$ sudo nc -ul 5000
hello
hello
hello
^C

 

지금까지는 모든 것이 예상대로 작동합니다. 그러나 입력을 클라이언트에 파이핑하여 지금 동일하게 시도한다고 가정 해 봅시다. 따라서 먼저 한 터미널에 UDP 서버를 설정하십시오.

$ sudo nc -ul 5000

… 그리고 다른 하나에서는 일부 데이터를 ncUDP 클라이언트 로 파이프합니다 .

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

… 클라이언트 명령 후에 쉘 입력은 입력을 기다리는 것처럼 정지합니다. 따라서 입력 hello하고 ENTER를 두 번 더 누릅니다. 그러나 서버는 첫 번째 hello(파이프를 통해 파이프 됨 echo) 만 등록했습니다 . 또한 Ctrl-C를 누르고 클라이언트 echo hello | nc -u 127.0.0.1 5000명령 을 반복하려고해도 서버는 여전히 첫 번째보고 만 유지합니다 hello.

$ sudo nc -ul 57130
hello
^C

… Ctrl-C를 사용하여 서버를 중지하고 다시 시작한 후에 만 ​​클라이언트 echo hello | nc -u 127.0.0.1 5000명령을 반복하고 작동하는 것을 관찰 할 수 있습니다.

 

이 방법 nc으로 동작합니까? echo hello | nc -u 127.0.0.1 5000서버를 다시 시작할 필요없이 적어도 반복 된 호출 이 등록 될 것으로 예상 합니까? 아니면 그런 종류의 행동을위한 특별한 명령 줄 스위치가 있습니까?

편집 : 나는이 좋은 PDF 프레젠테이션 발견 socat – 소켓의 모든 종류를 취급 , 다음이 포함되어 netcatsocat노트 :

netcat-제한 사항
● 원샷 만 (소켓을 닫은 후 종료)

예 1 : netcat 교체

● 소스 포트가있는 UDP 클라이언트 :
nc -u -p 500 1.2.3.4 500
socat-udp : 1.2.3.4 : 500, sp = 500
● TCP 서버 :
nc -l -p 8080
socat-tcp-l : 8080, reuseaddr

…하지만 서버 명령을 ” socat - udp4-listen:5000,reuseaddr“로 바꾸고 클라이언트 줄을 ” socat - udp:127.0.0.1:5000“로 바꾸면 파이프 입력, ” echo hello | socat - udp:127.0.0.1:5000“으로 유일한 차이점은 여기서는 적어도 단어 hello가 전송 된 후에 명령이 존재 하지만 서버가 다시 시작될 때까지이 명령을 연속적으로 실행해도 서버에서 수신이 발생하지 않습니다.



답변

좋아, 적어도 나는 뭔가를 가지고 있다고 생각한다. socat즉, 옵션 fork은 서버 라인에 추가되어야한다.

$ socat - udp4-listen:5000,reuseaddr,fork

… 그리고 다른 터미널에서는 명령 줄에서 클라이언트 라인에 여러 번 echo파이핑을 호출 할 수 있습니다. socat, 즉시 종료됩니다 ( 0.5 초 후에 ) :

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

… 첫 번째 터미널로 돌아가서 서버가 세 가지를 모두 성공적으로 표시했음을 알 수 있습니다 hello.

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

참고도에 fork-ed socat서버 줄 echo "hello" | nc -u 127.0.0.1 5000것입니다 여전히 ‘잠금’사용자 입력을 기다리는 것처럼; 그러나 이제 Ctrl-C 후 명령을 다시 실행하십시오.

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

…- forked socat서버는 hello다시 시작할 필요없이 3 초를 표시합니다 .

 

이 OpenBSD netcat에는 fork옵션 이 없지만, 해당 옵션에 해당 하는 옵션이 있는지 확실하지 않습니다.

어쨌든, 이것이 누군가를 도울 수 있기를 바랍니다,
건배!


답변

netcat은 파이프를 사용할 때 echo의 표준 출력에서만 출력을 읽습니다. 더 이상 키보드에 연결되지 않았습니다. 예상 한 응답을 얻기 위해 세 개의 “hello”를 파일에 추가 할 수 있습니다.

cat [myfile] | nc -u 127.0.0.1 5000

답변

수신 nc의 strace를 수행하면 netcat이 연결을 기다리고 있음을 나타내며 일단 연결되면 다른 모든 호스트는 무시하고 해당 호스트와 포트에 연결합니다. 계속 진행하려면 ‘-k’를 추가하고 0 초 후에 각 연결을 시간 초과하려면 ‘-w 0’을 추가해야합니다. Socat이 더 나은 선택이라고 생각합니다.