netcat이 응답을 인쇄하지 않습니다


12

명령을 실행 하고 입력 할 때 netcat파이프 응답을 사용 하여 파이프 응답을 사용하여 TCP 포트로 명령을 보내려고하는데 응답을 올바르게 인쇄하지만 파이프에서 명령을 전달하면 명령을 올바르게 보내지 만 응답을 인쇄하지 않습니다
netcat

따라서 이것은 올바르게 작동합니다.

netcat  localhost 9009

이것은 명령을 보내지 만 응답을 인쇄하지는 않습니다.

echo 'my_command' | netcat  localhost 9009

왜? 응답 텍스트를 인쇄하려면
어떻게 netcat해야합니까?


이것은 아마도 당신에게 일어나고 있습니다
Jeff Schaller

@JeffSchaller : 아니요! 불행히도 그 명령을 사용하는 것은 도움이되지 않습니다! 이번에는 영원히 차단됩니다!
RYN

어떤 넷캣을 사용하고 있습니까? 불행히도 netcat 도구에는 수십 가지 변형이 있으며 모두 동일하게 작동하지는 않습니다. 또한 원격 끝에 무엇이 있습니까?
Patrick

@ 패트릭 : 내 netcat은 OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)버전입니다. 원격 끝에는 telegram-cli동일한 시스템에 있습니다.
RYN

나는 그 넷캣에 대한 매뉴얼 페이지를 찾았다 고 생각하지만, 일어나고 있다고 의심되는 것을 제어하는 ​​플래그는 보이지 않습니다. netcatSTDIN에서 EOF를 수신하면 절반 닫힘을 수행하고 원격 쪽이 닫힐 때까지 기다리지 않고 소켓의 양쪽을 즉시 종료한다고 의심 됩니다. 경우 socat옵션은, 내가보기 엔 대신에게 추천 할 것입니다. 하나만 socat있기 때문에, 12 가지의 다른 맛이 있기 때문에 이식성 문제가 없으며 훨씬 더 산뜻하게 동작하며 고도로 구성 가능합니다.
Patrick

답변:


8

@Patrick이 말했듯 이이 문제는 일반적으로 netcat응답이 제공되기 전에 종료되기 때문에 발생합니다 . -q 2명령 행 에 추가 하여 netcat표준 입력에서 EOF를 감지 한 후 약 2 초간 정지하도록 지시하십시오. 분명히 다른 초 수만큼 기다릴 수 있습니다.


감사; -q 2일했지만 신뢰할 수 있습니까? 그것은 2 초가 항상 충분하다는 것을 확신 할 수없는 웹 요청을하고 있습니다! 할 수 있습니까?
RYN

1
더 오래 기다리려면 큰 숫자를 사용하고 무한정 기다리려면 음수를 사용하십시오. -w놀 수 있는 옵션 도 있습니다 . 이것은 man nc물론 페이지에 있습니다.
Ralph Rönnquist

5
그것은 말한다invalid option -- 'q'
phil294

후속 질문은 다음과 같습니다. 왜 nc응답을 기다리는 대신 즉시 종료합니까? 연결이 여전히 열려있는 경우, 제조사의의 옵션이 있어야 nc뿐만 아니라 끝으로 stdin을 위해, 주변에 대한 대기
theferrit32

6

이것을 사용하십시오 :

cat <(echo command) - | nc host port

문제는 ncstdin이 닫힌 직후에 연결을 닫는 것인데, 이는 간단한 my_command문자열의 경우 매우 빠르 므로 응답을받을 수있는 기회를 얻지 못합니다. 매우 큰 파일을 파이프하면 파일 보내기가 완료되기 전에 응답을받을 수 있음을 알 수 있습니다.

입력 cat-두 번째 인수로 : 그것은 수 cat는 첫 번째 인수의 내용을 보낸 후 통해 파이프에 더 많은 콘텐츠에 대한 표준 입력 (stdin)에서들을 수 있습니다. 첫 번째 인수는 echo명령을 전달 cat하는 것 cat < file - | ...입니다. 명령이 la 인 파일 일 수도 있습니다 .

또는 다음을 수행하십시오.

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

#입력의 두 번째 줄에 무제한 문자를 보냅니다 . #이것을 주석으로 무시하는 remote와 같은 bash에 대한 작업을 사용하십시오 . 여기서는 10 밀리 초의 작은 대기 시간을 선택 했으므로 연결 종료시 더 빠르게 반응합니다. YMMV.

그 단점은 할 수 있습니다 cat또는 while루프를하고 nc당신이 명중 할 때까지 계속 실행 ^C또는 ^D쉘에. 그것은 실제로 원격 끝에 달려 있습니다.

-w 1(OSX netcat) 또는 -i 1(nmap의 ncat)을 사용하여 시간 초과를 추가 하면 연결이 닫히고 nc1 초 후에 연결 되지만 cat문자를 입력하고 파이프가 끊어 질 때까지 계속 실행됩니다 (생각합니다).

그러나 명령을 수신하고 처리 한 후 원격 측에서 자동으로 연결을 닫는 경우 작동합니다. 이렇게하면 nc클라이언트와 프로세스 배관 도 종료 됩니다.

이 답변은 동일한 수퍼 유저 질문에 대한이 답변을 기반으로합니다 .


{ echo my_command; cat;}동일한 작업을 수행하고 이해하기 쉬운 것으로 간주 될 수 있습니다.
G-Man, 'Reinstate

1

다른 오픈 BSD - netcat을 버전의 서로 다른 조합을 필요로하는, 황당하다 -w <seconds>, -q <seconds>, -N연결의 다른 쪽 끝에서 실행되는 내용에 따라, 심지어 필요한 다른 인수를. 특정 버전 또는 서버에서 시간 종료 옵션을 사용하면 지연이 발생하고이를 사용하지 않으면 매우 긴 (무한?) 지연이 발생할 수 있습니다. 그리고 gnu netcat과 다른 단점을 기대하지만 버전마다 다른지 모릅니다.

예를 들어 archlinux의 버전 1.130_3은 내가 할 때 매우 오래 걸립니다 (영원합니까?).

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

그러나 서버 또는 클라이언트에 추가 된 -N과 함께 작동합니다.


1

나는 이것이 조금 오래되었다는 것을 알고 있지만 다른 대답은 나를 위해 효과가 없었으며 이것은 효과가 있었다.

echo 'test' | netcat -N $server $port

주목하십시오 -N:

입력에서 EOF 후 네트워크 소켓을 종료하십시오. 일부 서버는 작업을 마치기 위해 이것을 요구합니다.

Windows와 Linux 모두에서 나를 위해 일했습니다.

참고 : 이것은 중복 질문 에 대해 게시 한 답변의 사본 입니다.

나는 이것이 유용 할 수 있다고 생각합니다. 정책이나 다른 정책에 위배되는 경우 Mods는 자유롭게 편집 / 삭제할 수 있습니다.

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