나는이 가까운 것 같다 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
… 그리고 다른 하나에서는 일부 데이터를 nc
UDP 클라이언트 로 파이프합니다 .
$ 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 – 소켓의 모든 종류를 취급 , 다음이 포함되어 netcat
대 socat
노트 :
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
…- fork
ed 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이 더 나은 선택이라고 생각합니다.