파이핑 및 UDP의 Netcat / socat 동작?


16

나는이 가까운 것 같다 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가 전송 된 후에 명령이 존재 하지만 서버가 다시 시작될 때까지이 명령을 연속적으로 실행해도 서버에서 수신이 발생하지 않습니다.

답변:


23

좋아, 적어도 나는 뭔가를 가지고 있다고 생각한다. 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옵션 이 없지만, 해당 옵션에 해당 하는 옵션이 있는지 확실하지 않습니다.

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


4

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

cat [myfile] | nc -u 127.0.0.1 5000

안녕하세요 @OldWolf-답변 주셔서 감사합니다! 내가 ( "약간 더 복잡한 방법으로 또한 당신의 제안을 시도했다 cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000") 나는 세 가지를 참조 할 때, 그러나, hello들, 걸 퍼즐 여전히 존재하는이 명령에 너무 종류의 것 "잠금", 것처럼에서 입력 된 입력을 대기 Ctrl-C를 다시 실행 한 후 서버를 다시 시작할 때까지 데이터가 표시되지 않습니다! 그것이 내가 더 잘 알고 싶은 것입니다-건배!
sdaau

2
nc는 EOF를 기다리고 있는데,이 경우 종료 신호를 프로그램에 보낼 때까지 도착하지 않습니다.
OldWolf

아, 알겠습니다-@OldWolf! 옵션 으로이 문제를 socat해결할 수 있습니다. fork다시 한번 감사합니다.
sdaau

3

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

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