netcat
파이프 응답을 사용하여 TCP 포트에 명령을 보내 려고 합니다 . 명령을
실행 netcat
하고 입력하면 응답이 올바르게 인쇄되지만 파이프에서 명령을 전달하면 명령이 올바르게 보내지지만 응답이 인쇄되지 않습니다.
따라서 이것은 올바르게 작동합니다.
netcat localhost 9009
이는 단지 명령을 보내기만 하고 응답을 인쇄하지는 않습니다.
echo 'my_command' | netcat localhost 9009
왜? 응답 텍스트를
어떻게 인쇄할 수 있나요 ?netcat
답변1
이것을 사용하십시오 :
cat <(echo command) - | nc host port
문제는 nc
stdin이 닫히자마자 연결이 닫히게 된다는 점인데, 이는 간단한 my_command
문자열의 경우 매우 빠르기 때문에 응답을 받을 기회가 전혀 없습니다. (매우 큰 파일을 파이프하면 파일 전송이 완료되기 전에 응답을 받을 수 있습니다.)
두 번째 cat
인수 입력 -
: cat
첫 번째 인수의 내용을 보낸 후 더 많은 내용을 위해 표준 입력을 수신합니다. 첫 번째 매개변수는 echo
명령이 실행되도록 합니다 cat
. la 명령을 포함하는 파일일 수도 있습니다 cat < file - | ...
.
아니면 이렇게 하세요:
(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port
#
입력의 두 번째 줄에 무한한 문자를 보냅니다 . #
Bash와 같은 원격 장치를 사용할 때는 이 주석이 무시됩니다. 여기서는 연결 측에서 더 빠르게 반응하도록 10밀리초라는 더 짧은 대기 시간을 선택했습니다. YMMV.
이것의 단점은 쉘에 부딪히 거나 칠 때까지 cat
루프가 while
계속 실행된다는 것입니다. 실제로 원격 측에 따라 다릅니다.nc
^C
^D
-w 1
(OSX netcat) 또는 (nmap의 경우 ncat)을 사용하여 시간 제한을 추가하면 1초 후에 연결이 닫히지 -i 1
만 일부 문자를 입력하고 파이프가 끊어질 때까지 계속 실행됩니다.nc
cat
그러나 명령을 수신하고 처리한 후 원격 측이 자동으로 연결을 닫으면 작동합니다. 이로 인해 nc
클라이언트와 클라이언트로 들어가는 프로세스 파이프도 종료됩니다.
이 답변은 다음을 기반으로합니다.이것은 동일한 슈퍼유저 질문에 대한 답변입니다..
답변2
@Patrick이 말했듯이 이 문제는 일반적으로 netcat
응답이 제공되기 전에 종료하여 발생합니다. 표준 입력에서 EOF를 감지한 후 약 2초 동안 정지 -q 2
하도록 지시하는 명령줄을 추가하면 이 문제를 해결할 수 있습니다 . netcat
분명히 다른 초 동안 기다리게 할 수도 있습니다.
답변3
다른 openbsd-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을 추가하여 사용할 수 있습니다.
답변4
nmap에서 ncat을 사용하고 있습니다.
Ncat: Version 7.80 ( https://nmap.org/ncat )
--no-shutdown 옵션은 이 문제를 해결합니다.
echo 'test' | netcat --no-shutdown $server $port