Borularda ve UDP'de Netcat / socat davranışı?


14

Sanırım bu linux'a yakın - Netcat UDP trafiğini dinlemeyi bıraktı - Süper Kullanıcı , ama yine de sormam gerektiğini düşündüm

Bildiğim kadarıyla netcat sürümleri Ubuntu 11.04 kullanıyorum ve varsayılan netcattahmin ediyorum üzerinde olduğu openbsdtek:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

Garip bulduğum şey bu: ilk vaka beklendiği gibi çalışıyor - bir terminalde bir UDP sunucusu açıyorum:

$ sudo nc -ul 5000

... ve başka bir terminalde yeni bir UDP istemci bağlantısı başlattım - ve helloher biri ardından ENTER tuşuna basarak üç kez yazdım :

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... ve sunucu terminaline geri dönüldüğünde, hellobeklendiği gibi üç kez yazdırıldı :

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Şimdiye kadar iyi, hepsi beklendiği gibi çalışıyor. Bununla birlikte, müşteriye girdiler ekleyerek şimdi aynı şeyi deneyeyim diyelim; bu yüzden ilk önce bir terminalde bir UDP sunucusu kurun:

$ sudo nc -ul 5000

... ve diğerinde, bazı verileri ncUDP istemcisi olarak aktarın:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... istemci komutundan sonra, kabuk sanki girdi bekliyormuş gibi donuyor - bu yüzden orada helloiki kez daha yazıyorum ; ancak sunucu yalnızca ilkini kaydetti hello(üzerinden yayınlandı echo). Ayrıca, Ctrl-C tuşlarına basıp istemci echo hello | nc -u 127.0.0.1 5000komutunu tekrarlamaya çalışsanız bile , sunucu ilk başta rapor vermeye devam edecektir hello:

$ sudo nc -ul 57130 
hello
^C

... ve sadece sunucuyu Ctrl-C ile durdurduktan ve yeniden başlattıktan sonra müşteri echo hello | nc -u 127.0.0.1 5000komutunu tekrarlayabilir ve çalıştığını gözlemleyebilir.

 

Bu şekilde ncdavranması mı gerekiyor? En azından tekrarlanan aramaların kaydedilmesini beklerdim echo hello | nc -u 127.0.0.1 5000- sunucuyu yeniden başlatmak zorunda kalmadan? Ya da belki bu tür davranışlar için özel bir komut satırı anahtarı vardır?

EDIT: Bu güzel PDF sunumunu buldum: socat - Aşağıdaki netcatve socatnotları içeren her çeşit Soket'i kullanma :

netcat - Sınırlamalar
● sadece bir atış (soket kapattıktan sonra sona erer)
...
Örnek 1: netcat Değiştirme
...
● Kaynak bağlantı noktasına sahip UDP istemcisi:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● TCP sunucusu:
nc
-lp- 8080 socat - tcp-l: 8080, yeniden denetle
...

Ben "ile sunucu komutu yerine eğer ... Ancak, hemen hemen yukarıdaki gibi aynı davranışı alıyorum socat - udp4-listen:5000,reuseaddr" - ve istemci hattını " socat - udp:127.0.0.1:5000" "borulu girişi ile ... echo hello | socat - udp:127.0.0.1:5000, tek fark olmasıdır" burada komut en azından sözcük hellogönderildikten sonra mevcuttur - ancak, yine de, bu komutun ardışık olarak çalıştırılması, sunucu yeniden başlatılıncaya kadar sunucuda alım yapılmasına neden olmaz.

Yanıtlar:


20

Tamam, sanırım en azından bir şey buldum socat- yani, seçeneğin forksunucu hattına eklenmesi gerekiyor:

$ socat - udp4-listen:5000,reuseaddr,fork

... ve sonra başka bir terminalde, echoboru socathattını komut satırında birden fazla kez arayabiliriz , çünkü hemen çıkacaktır ( yarım saniye sonra :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... ve ilk terminale geri dönersek, sunucunun her üç hellosaniyeyi de başarıyla gösterdiğini görebiliriz :

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Bir fork-ed socatsunucusunda bile , hattın echo "hello" | nc -u 127.0.0.1 5000kullanıcı girişi bekliyormuş gibi 'kilitleneceğini' unutmayın; ancak, şimdi Ctrl-C ve komutu yeniden çalıştırdıktan sonra

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... fork-ed socatsunucusu helloyeniden başlatılmasına gerek kalmadan üç saniye gösterecek ..

 

Görünüşe göre, bu openBSD netcatbir forkseçeneğe sahip değil - ama ona uygun olanın olup olmadığından emin değilim.

Neyse, umarım bu birine yardımcı olur,
Şerefe!


4

Netcat'ınız boru kullandığınızda yalnızca echo'nun stdout çıkışını okuyor, artık klavyeye "bağlı" değil. Beklediğiniz yanıtı almak için, üç "merhaba" ınızı bir dosyaya ekleyebilirsiniz.

cat [myfile] | nc -u 127.0.0.1 5000

Merhaba @OldWolf - Cevabınız için çok teşekkürler! Önerinizi denedim (ayrıca biraz daha karmaşık bir şekilde, " cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), ancak, üç hellosaniye görsem de, hala ne gibi bulmacalar mevcut: bu komut da, "giriş" için yazılan girişi bekler gibi kullanıcı, ve Ctrl-C ve yeniden çalıştırdıktan sonra, sunucu yeniden başlatılıncaya kadar hiçbir veri göremez !? Daha iyi bilmek istediğim şey bu - şerefe!
sdaau 03:11

2
nc, bu durumda, çıkış sinyalini programa gönderinceye kadar alamayacak bir EOF üzerinde bekliyor.
OldWolf

Ahh, anlıyorum - bu açıklama için çok teşekkürler, @OldWolf! Görünüşe göre socatbu forkseçeneği ile çalışabilir ... Tekrar teşekkürler, şerefe!
sdaau

3

Dinleme nc'sini bozarsanız, netcat'in bağlantıyı beklediğini gösterir ve bir kez alırsa, diğerlerini yok sayarak bu ana bilgisayara ve bağlantı noktasına bağlanır. Devam etmek için '-k' ve 0 saniye sonra her bağlantının zaman aşımına '-w 0' eklemeniz gerekir. Socat daha iyi bir seçim.

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.