netcat으로 UDP 패킷을 하나만 보내는 방법은 무엇입니까?


120

UDP 패킷에 짧은 값을 하나만 보내고 싶지만 명령을 실행합니다.

echo -n "hello" | nc -4u localhost 8000

서버가 hello 항목을 받고 있음을 알 수 있지만 netcat 명령을 종료하려면 Ctrl+ c를 눌러야 합니다.

Hello 를 보낸 후 어떻게 종료 할 수 있습니까?


죄송합니다. 맨 페이지를 다시 읽고 -q옵션을 찾았습니다 .

 echo -n "hello" | nc -4u -q1 localhost 8000

작동합니다 (1 초 후에 종료 됨).

어떤 이유로 -q0.


데비안 맨 페이지 :-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
luckydonald

답변:


204

bash를 사용하는 경우 다음과 같이 작성하는 것이 좋습니다.

echo -n "hello" >/dev/udp/localhost/8000

그리고 netcat의 모든 특이성과 비 호환성을 피하십시오.

이것은 또한 다른 호스트로의 전송도 작동합니다. 예 :

echo -n "hello" >/dev/udp/remotehost/8000

이것은 파일 시스템의 "실제"장치가 아니라 bash "특수" 별칭 입니다. Bash 매뉴얼 에 추가 정보가 있습니다 .


24
네, 맞습니다. ZSH에서는 작동하지 않는다는 것을 분명히 말씀 드리겠습니다.
jturolla

1
이것은 netcat을 사용하는 것보다 낫습니다. 팁 고마워!
johnboiles

3
이것은 내가 본 것 중 가장 놀라운 것일 수 있습니다.
freb

4
어떤 이유로 우분투 14.04에서 127.0.0.1대신 사용해야 했습니다 localhost. (예, localhost/etc/hosts있습니다.)
tuomassalo

3
/dev/udp/실제 파일이 아닙니다. bash에서 특별히 해석 한 파일 이름 일뿐입니다.
Peter Eisentraut

46

-q1내 netcat 에서 옵션을 찾지 못했습니다 . 대신 -w1옵션을 사용했습니다 . 다음은 udp 패킷을 호스트 및 포트로 보내기 위해 수행 한 bash 스크립트입니다.

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT

OS X는 이것을 작동합니다 : SimonW가 말한 것처럼 "echo -n"test "| nc -4u -w0 localhost 9999"
Simon Unsworth

14

현재 netcat (v0.7.1)에는 -c 스위치가 있습니다.

-c, --close                close connection on EOF from stdin

그 후,

echo "hi" | nc -cu localhost 8000

트릭을해야합니다.


3
이것은 GNU netcat에만 해당되며 BSD netcat에는 해당되지 않습니다.
MarSoft

명확성을 위해 Linux 기반 netcat에서 -c 옵션에는 "/ bin / bash를 통해 주어진 인수를 실행"하는 인수로 명령이 필요합니다.- commandlinux.com
Blake 닐

5

Netcat은 개행마다 하나의 패킷을 보냅니다. 그래서 당신은 괜찮습니다. 더 복잡한 작업을 수행하면 다른 작업이 필요할 수 있습니다.

나는 이것을 깨달았을 때 Wireshark를 속이고 있었다. 도움이되는지 모르겠습니다.


3
나는 이것이 TCP에만 맞다고 생각합니다. UDP를 사용하면 하나의 패킷으로 여러 줄을 보냅니다 (적합한 경우).
sleske 2014-08-28

1
아니요. 간단히 테스트 echo -n "hello\nworld" >/dev/udp/localhost/514하면 두 줄을 얻을 수 있습니다
bebbo

5

나는 같은 문제가 있었지만 -w 0옵션을 사용 하여 하나의 패킷 만 보내고 종료했습니다. 다음 명령을 사용해야합니다.

echo -n "hello" | nc -4u -w0 localhost 8000

nc 1.10-41 + b1은 -w0. 오류 : 유효하지 않은 대기 시간 0
palik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.