살아있는 넷캣에 명령을 어떻게 파이프 할 수 있습니까?


32
echo command | netcat host port

이로 인해 명령이 원격 호스트로 전송되고 일부 데이터가 다시 읽 힙니다. 그러나 몇 초 후에 연결이 닫힙니다. -w 매개 변수는 아무것도 변경하지 않았습니다. SuSE 10.1에서 netcat v1.10을 사용하고 있습니다.


연결을 닫는 원격 호스트가 아닙니까?
grawity

예. netcat을 수행 한 다음 명령을 수동으로 입력하면 netcat이 무기한으로 유지됩니다.
Chris

왜 살아있어? 에코 매개 변수를 인쇄 한 다음 죽습니까?
M'vy

1
원격 서버에서 오는 데이터를 계속 받도록 살아 있기를 원합니다.
Chris

2
그건 사실이 아니야. "netcat <host> <port>"는 양방향 TCP 소켓을 엽니 다.
Chris

답변:


33

이것은 ncOS X 의 명령에서 작동합니다 (전송하려는 명령이 파일에 있다고 가정).

cat file - | nc host port

본질적으로 cat 으로 stdout에서 파일 내용을 덤프 한 다음 stdin에서 기다립니다.

확장 적으로 쉘 자체에서 명령을 보내려면 다음을 수행하십시오.

cat <(echo command) - | nc host port

netcat에 모든 멋진 옵션이없는 매우 베어 본 임베디드 시스템에서 작동하기 때문에 좋습니다.
SF.

{ echo command; cat;}같은 일을하고 이해하기 쉬운 것으로 간주 될 수 있습니다.
G-Man, 'Reinstate

1
내가 알 수 있듯이 netcat명령은 입력이 끝날 때까지 소켓을 열어 둡니다. 이 모든 예들은 실제로 왜 그런지에 대해 많이 말하지 않고 이것을 보여줍니다 . 다음을 사용 하여 장시간 동안 서버를 사용하여 상호 작용하고 있습니다. SocketTest 는 모든 TCP 또는 UDP 포트에서 수신하거나 제공 할 수있는 편리한 도구입니다. SocketTest netcatcat - | nc localhost 8063
것이다

14

nc우분투 :

nc -q -1 host port

로부터 우분투 ncman 페이지 :

 -q seconds
         after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.

사용 가능한 nc옵션은 배포판마다 매우 다양하므로이 옵션이 작동하지 않을 수 있습니다 (OpenSUSE).


12

찾았어요:

echo command | netcat host port -

동료가 그것을 알고있었습니다. 설명서에서 전혀 보지 못했습니다.


2

나는 당신이 netcat 또는 socat로 이것을 관리 할 것이라고 생각하지 않습니다. 나는 방금 두 가지 모두로 광범위한 땜질을 해왔고 socat은 가장 유망한 것처럼 보였다.

원격 TCP 포트에 연결하고 로컬 유닉스 도메인 소켓 (이론적으로 링크를 항상 유지할 수 있음)에서 청취하도록 socat을 설정했지만 로컬 프로세스가 유닉스 소켓에서 분리 된 즉시 (다른 소켓) 유닉스 소켓을 stdin / out에 연결) TCP socat 세션을 닫았습니다.

여기서 문제는 netcat / socat을 통한 각 연결이 서버에 새로운 TCP 스트림 연결을 만들고 로컬 끝이 연결 해제 될 때 해당 TCP 스트림 세션을 닫는 것입니다.

아마도 TCP 연결을 원격 끝으로 연 다음 소켓 / 파이프 / fifo 또는 로컬에서 청취 한 다음 기존 TCP 파이프로 데이터를 전송하는 사용자 지정 프록시 소프트웨어를 작성해야 할 것입니다. 결과를 반환합니다.


전능하신 Matt Jenkins의 말을 듣습니다. : D
M'vy

2

소켓의 다른 쪽 끝에서 연결이 닫 혔을 수 있습니까?

nc( -k옵션으로) 계속 들으라고 지시하지 않으면 기본적으로 완료 후 연결을 닫습니다 .

 -k    Forces nc to stay listening for another connection after its current
       connection is completed.  It is an error to use this option without the
       -l option.

참조하십시오 man nc.1.


다음과 같이 두 컴퓨터간에 데이터를 성공적으로 스트리밍하고 있습니다.

  • 송신기:

    while (true); do 
      echo -n "$RANDOM " | nc <host> <port>
    done
    
  • 리시버:

    nc -kl <port> 
    

1

Georges의 방법은 대화식 쉘에서 잘 작동하지만 스크립트를 다음과 같이 호출 할 때 스크립팅에는 도움이되지 않습니다. nohup ./script & .

stdin을 더미 fifo로 대체하는 것을 발견했습니다.

 mkfifo dummy
 cat command.txt dummy | nc host port

파일을 출력 한 후에는 fifo에 아무 것도 쓰지 않으므로 파일 cat에 무기한으로 매달립니다.


0

socatshut-none옵션이 여기에 도움이됩니다.

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

을 사용하여 기본 시간 초과 기간을 재정의해야 할 수도 있습니다. -t <timeout>그렇지 않으면 소켓이 0.5 초 후에 닫힙니다. 이 옵션은 다음과 같은 기본 동작을 재정의합니다.

When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.

따라서 다음과 같은 명령이 있습니다.

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

'blah'를 보낸 후 10 초 동안 소켓을 열어 둡니다.


0

원격 호스트가 연결을 닫거나 도달 할 수없는 경우 또는 파이프가 종료되기 전에 명령이 종료되면 (netcat이 여전히 나머지 입력 큐를 보내는 동안) 명령이 종료됩니다.

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