netcat, stdin kapandığında sonlanmaz


12

Üzerinden mesaj göndermeye çalışıyorum netcat. Mesajı gönderdikten sonra netcatsonlandırılmalıdır.

Aşağıdakileri denedim:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

-qOpsiyon devletler:

-q saniye

stdin'de EOF'dan sonra, belirtilen saniye sayısını bekleyin ve ardından çıkın. Saniye negatifse, sonsuza kadar bekleyin.

Fakat

nc -q0 -u localhost 4300 < message.bin

ayrıca çalışmıyor.

Neyi kaçırıyorum?

Yanıtlar:


7

EOF bağlantısı gönderdikten sonra boşta kalacağını varsayarsak, sıfıra eşit olarak -w timeoutçalışan seçeneği kullanabilirsiniz timeout(aptal -qseçeneğin aksine ...)

cat tsmmessage.bin | nc -u localhost 4300 -w0

1
Bu doğru cevaptır ve bunun yerine kabul edilen cevap olmalıdır -q.
ccpizza

1
Sıfır zaman aşımı makinemde çalışmıyor (debian stretch). diyorinvalid wait-time 0
Anubis

3

-qBayrak olmadan örneğiniz netcatsonsuza kadar bekleyecektir. UDP ile "akış sonu" mesajı yoktur, bu nedenle netcathem stdin hem de ağ bağlantısının bittiğini bilmenin bir yolu yoktur .

Örneğin, TCP / IP kullanarak bu beklendiği gibi çalışır:

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

Ancak belirlediğiniz gibi, UDP / IP kullanarak bu asla bitmez:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

-qBayrak burada devreye giriyor. Maalesef değeri kabul etmiyor 0. Tamsayı olmayan değerleri de kabul etmez. İşte size timeoutveya başka bir harici yardımcı programa başvurmadan sunabileceğim en iyi alternatif :

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

Burada bile, dinleme netcatzamanının zarif bir şekilde bitmesi mümkün değildir . (Zaman -waşımı seçeneği yok sayılır ve -qönemsizdir.) Bunun gibi bir şey pratik bir durumda kullanılabilir, böylece netcat90 saniye sonra öldürülür:

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

-q 0benim için çalışıyor.
AlikElzin-kilaka

@ AlikElzin-kilaka yine de benim için çalışmıyor. Testlerinizde kesinlikle UDP mi kullanıyorsunuz? Netcat'in hangi sürümü var? Muhtemelen daha yeni bir sürümdesiniz.
roaima

0

udp

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

tcp

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300

neden inişler? -N seçeneği bu sorunu çözer
camelccc

-1

Google, hemen hemen aynı sorunla ilgili olarak tökezledi. Sorun, netcat'in tüm veriler emildikten hemen sonra, yanıt alma şansı olmadan bash tarafından öldürüldüğü ortaya çıktı.

Bu benim çözüm veri gibi borulama sonra biraz gecikme eklemek oldu, şöyle:

(echo INFO; sleep 1) | nc redis.service.consul 6379

Bir dosya ile şöyle görünebilir:

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300

netcathala sleepbittiğinde kapanmıyor . İlk komut satırının 1 saniye sonra istemine dönmesini beklerdim, ama istemez.
Frank Kusters

eklemeye ne dersin -q 1? yani (echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379?
SkyWriter

İle -qözgün soru bile örnek herşey işler. O zamandan beri Ubuntu'nun yeni bir sürümüne geçtim, belki de bu fark yaratır.
Frank Kusters

Bu tuhaf. Her neyse, ikimiz de bu konuda bir yol bulduk sevindim :)
SkyWriter
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.