Netcat ile sadece bir UDP paketi nasıl gönderilir?


122

Bir UDP paketinde yalnızca bir kısa değer göndermek istiyorum, ancak şu komutu çalıştırıyorum

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

Sunucunun merhaba şeyler aldığını görebiliyorum ama netcat komutundan çıkmak için Ctrl+ ' cya basmam gerekiyor.

Merhaba gönderdikten sonra nasıl çıkmasını sağlayabilirim ?


Üzgünüm, gürültü için man sayfasını tekrar okudum ve -qseçeneği buldum .

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

çalışır (1 saniye sonra kapanır).

Bazı nedenlerden dolayı çalışmıyor -q0.


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

Yanıtlar:


205

Bash kullanıyorsanız, yazabilirsiniz de

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

ve netcat'in tüm özelliklerinden ve uyumsuzluklarından kaçının.

Bu aynı zamanda diğer ana bilgisayarlara gönderimde de çalışır, örn:

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

Bunlar dosya sistemindeki "gerçek" aygıtlar değil, "özel" takma adlardır . Bash Kılavuzunda ek bilgiler bulunmaktadır .


25
Tamam, haklısın, bunun ZSH ile çalışmayacağını açıkça belirtmeme izin ver.
jturolla

1
Bu, netcat ile uğraşmaktan çok daha iyi. Bahşiş için teşekkürler!
johnboiles

3
Bu şimdiye kadar gördüğüm en şaşırtıcı şey olabilir.
freb

4
Bazı nedenlerden dolayı, 127.0.0.1bunun yerine localhostUbuntu 14.04'te kullanmam gerekiyordu . (Evet, var localhostiçinde /etc/hosts.)
tuomassalo

3
/dev/udp/gerçek bir dosya değil. Sadece bash tarafından özel olarak yorumlanan bir dosya adı.
Peter Eisentraut

46

-q1Seçeneği netcat'imde bulamadım . Bunun yerine -w1seçeneği kullandım . Herhangi bir ana bilgisayara ve bağlantı noktasına bir udp paketi göndermek için yaptığım bash betiği aşağıdadır:

#!/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 şu şekilde çalışır: SimonW'nin dediği gibi "echo -n" test "| nc -4u -w0 localhost 9999"
Simon Unsworth

14

Mevcut bir netcat'te (v0.7.1) bir -c anahtarınız vardır:

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

Bu nedenle,

echo "hi" | nc -cu localhost 8000

hile yapmalı.


3
Bunun yalnızca GNU netcat için geçerli olduğunu, BSD netcat için geçerli olmadığını unutmamak önemlidir.
MarSoft

Netlik sağlamak için, Linux tabanlı netcat ile -c seçeneği, "verilen bağımsız değişkeni / bin / bash aracılığıyla çalıştıran" bir bağımsız değişken olarak bir komut gerektirir - commandlinux.com/man-page/man1/nc.1.html
Blake Neal

5

Netcat yeni satır başına bir paket gönderir. Yani iyisin. Daha karmaşık bir şey yaparsanız, başka bir şeye ihtiyacınız olabilir.

Bunu anladığımda Wireshark ile dalga geçiyordum. Yardımı olup olmadığını bilmiyorum.


3
Bunun yalnızca TCP için doğru olduğunu düşünüyorum. UDP ile, tek bir pakette birden çok satır gönderir (uygunsa).
sleske

1
Hayır. Sadece test edin echo -n "hello\nworld" >/dev/udp/localhost/514ve 2 satır elde edin
bebbo

5

Aynı sorunu yaşadım ama -w 0sadece bir paket gönderip çıkma seçeneğini kullanıyorum . Bu komutu kullanmalısınız:

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

nc 1.10-41 + b1 kabul etmiyor -w0. Hata: geçersiz bekleme süresi 0
palik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.