stdin이 닫힐 때 netcat이 종료되지 않습니다


11

를 통해 메시지를 보내려고합니다 netcat. 메시지를 보낸 후 netcat종료해야합니다.

나는 다음을 시도했다.

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

-q옵션 상태 :

-q 초

stdin에서 EOF 후 지정된 시간 (초) 동안 기다렸다가 종료하십시오. 초가 음수이면 영원히 기다리십시오.

그러나

nc -q0 -u localhost 4300 < message.bin

작동하지 않습니다.

내가 무엇을 놓치고 있습니까?

답변:


6

EOF 연결을 보낸 후에 유휴 상태로 있다고 가정하면 -w timeout옵션 을 사용할 수 있습니다.이 옵션 timeout은 0과 같습니다 (멍청한 -q옵션 과 달리 ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0

1
이것은 정답이며, 대신 승인 된 것이어야합니다 -q.
ccpizza

1
내 컴퓨터에서 제로 타임 아웃이 작동하지 않습니다 (데비안 스트레치). 그것은 말한다invalid wait-time 0
아누비스

3

-q깃발이 없으면 당신의 인스턴스는 netcat영원히 기다릴 것입니다. UDP에는 "스트림 끝"메시지가 없으므로 stdin 과 네트워크 연결이 모두 완료 netcat되었음을 알 수있는 방법이 없습니다 .

예를 들어, TCP / IP를 사용하면 예상대로 작동합니다.

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

그러나 결정했듯이 UDP / IP를 사용하면 결코 끝나지 않습니다.

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

이것은 -q플래그가 들어오는 곳 입니다. 그러나 불행히도 값은 받아들이지 않습니다 0. 또한 정수가 아닌 값을 허용하지 않습니다. 다음은 timeout다른 외부 유틸리티 를 사용하지 않고 제공 할 수있는 최상의 대안입니다 .

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

여기에서도 청취 netcat시간이 정상적으로 종료되는 것은 불가능합니다 . ( -w시간 초과 옵션은 무시 -q되며 관련이 없습니다.) 이와 같은 것은 실제 상황에서 사용되어 netcat90 초 후에 종료됩니다.

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

-q 0나를 위해 작동합니다.
AlikElzin-kilaka 8시

@ AlikElzin-kilaka는 나를 위해 작동하지 않습니다. 테스트에서 UDP를 확실히 사용하고 있습니까? 어떤 버전의 netcat이 있습니까? 아마도 최신 버전 일 것입니다.
roaima

0

UDP

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

tcp

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300

왜 downvotes? -N 옵션은이 문제를 해결합니다
camelccc

-1

인터넷 검색에서 거의 같은 문제에 대해이 문제가 발생했습니다. 문제가 발생했을 때 netcat이 모든 데이터가 흡입 된 직후 bash에 의해 살해되었다는 것이 밝혀졌습니다.

이것에 대한 나의 해결책은 다음과 같이 데이터를 파이핑 한 후 약간의 지연을 추가하는 것이 었습니다.

(echo INFO; sleep 1) | nc redis.service.consul 6379

파일을 사용하면 다음과 같이 보일 수 있습니다.

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300

netcatsleep완료 해도 여전히 닫히지 않습니다 . 첫 번째 명령 줄이 1 초 후에 프롬프트로 돌아올 것으로 예상하지만 그렇지 않습니다.
Frank Kusters 2016 년

추가는 -q 1어떻습니까? 즉 (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
SkyWriter

-q내 원래의 문제도 예를 들어 모든 작품. 그 이후로 새로운 버전의 우분투로 옮겼습니다.
Frank Kusters 2016 년

이상 하네. 어쨌든, 우리 둘 다 이것에 대한 길을 찾았 다니 기쁘다 :)
SkyWriter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.