Bagaimana cara mengirim hanya satu paket UDP dengan netcat?

120

Saya ingin mengirim hanya satu nilai pendek dalam paket UDP, tetapi menjalankan perintah

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

Saya dapat melihat bahwa server mendapatkan hal-hal halo tetapi saya harus menekan Ctrl+ cuntuk keluar dari perintah netcat.

Bagaimana saya bisa membuatnya berhenti setelah mengirim halo ?


Maaf, untuk kebisingannya, saya membaca ulang halaman manual dan menemukan -qopsinya.

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

bekerja (berhenti setelah 1 detik).

Untuk beberapa alasan itu tidak berhasil -q0.

Janne H.
sumber
Halaman -q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
manual

Jawaban:

204

Jika Anda menggunakan bash, Anda sebaiknya menulis

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

dan hindari semua keanehan dan ketidaksesuaian netcat.

Ini juga berfungsi mengirim ke host lain, mis:

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

Ini bukan perangkat "nyata" pada sistem file, tetapi bash alias "khusus" . Ada informasi tambahan di Bash Manual .

Peter Eisentraut
sumber
24
Oke, Anda benar, izinkan saya menjelaskan bahwa ini tidak akan berfungsi dengan ZSH.
jturolla
1
Ini jauh lebih baik daripada menyia-nyiakan netcat. Terima kasih atas tipnya!
johnboiles
3
Ini mungkin hal paling menakjubkan yang pernah saya lihat.
freb
4
Untuk beberapa alasan, saya perlu menggunakan 127.0.0.1bukan pada localhostpada Ubuntu 14.04. (Ya, saya harus localhostdi /etc/hosts.)
tuomassalo
3
/dev/udp/bukan file asli. Ini hanya nama file yang diinterpretasikan secara khusus oleh bash.
Peter Eisentraut
46

Saya tidak menemukan -q1opsi di netcat saya. Sebagai gantinya saya menggunakan -w1opsi. Di bawah ini adalah skrip bash yang saya lakukan untuk mengirim paket udp ke semua host dan port:

#!/bin/bash

def_host=localhost
def_port=43211

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

echo -n "$1" | nc -4u -w1 $HOST $PORT
TraderJoeChicago
sumber
OS X menjalankan ini: "echo -n" test "| nc -4u -w0 localhost 9999" seperti yang dikatakan SimonW
Simon Unsworth
14

Pada netcat saat ini (v0.7.1) Anda memiliki tombol -c:

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

Karenanya,

echo "hi" | nc -cu localhost 8000

harus melakukan triknya.

Simon
sumber
3
Penting untuk dicatat bahwa ini hanya berlaku untuk GNU netcat, tetapi tidak untuk netcat BSD.
MarSoft
Untuk kejelasan, dengan netcat berbasis Linux, opsi -c memerlukan perintah sebagai argumen, yang "mengeksekusi argumen yang diberikan melalui / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal
5

Netcat mengirim satu paket per baris baru. Jadi kamu baik-baik saja. Jika Anda melakukan sesuatu yang lebih kompleks maka Anda mungkin membutuhkan sesuatu yang lain.

Saya sedang bermain-main dengan Wireshark ketika saya menyadari ini. Tidak tahu apakah itu membantu.

Evan
sumber
3
Saya rasa ini hanya benar untuk TCP. Dengan UDP, itu akan mengirim banyak baris dalam satu paket (jika cocok).
sleske
1
Tidak. Cukup uji echo -n "hello\nworld" >/dev/udp/localhost/514dan Anda akan mendapatkan 2 baris
bebbo
5

Saya memiliki masalah yang sama tetapi saya menggunakan -w 0opsi untuk mengirim hanya satu paket dan keluar. Anda harus menggunakan perintah ini:

echo -n "hello" | nc -4u -w0 localhost 8000
Sajjad Baeidi
sumber
nc 1.10-41 + b1 tidak menerima -w0. Kesalahan: waktu tunggu tidak valid 0
palik