Bash tarafından kurulan bir TCP bağlantısı nasıl sonlandırılır?


17

exec 3<>/dev/tcp/192.168.0.101/6435192.168.0.101:6435 ile bir TCP bağlantısı kurmak için kullandım . pipeKomuta ile birlikte birkaç mesaj da aldım .

Şimdi, TCP bağlantısını sonlandırmak istiyorum. Ancak, ss -anpetbash'ın kendisinin bu süreci sürdürdüğünü, bir çocuk süreci istemeden görebilirim.

Bash sürecine 9 ve 15 sinyalleri göndermeye çalıştım, ancak bildiğiniz gibi bash kendini öldüremez.

Peki, kullandığım pts'i sonlandırmadan kurduğum TCP bağlantısını sonlandırabilir miyim (ne kök tarafından öldürür ne de Ctrl + D gönderir)?


Başka bir mermi alıp basho mermiyle öldürür müsün?
trysis

3
bashkesinlikle olabilir kendisini öldürmek - Eğer burada yapmak istediğim şey aslında değil ama!
psmears

@TJM, bu büyüleyici soruyu başkaları için daha yararlı hale getirmek için, pipekullandığınız ve sistemimde bulamadığım komutu ayrıntılı olarak açıklayabilir misiniz? Hangi paket pipegeliyor? /dev/tcp/...Bağlantı üzerinden veri göndermek / almak için hangi (örnek) parametreleri iletebilirsiniz ? Teşekkürler.
arielf

@arielf Tipik olarak, Bilgisayar Bilimi'nin yeni başlayan biriyim ve sedbot adlı bir bash kabuk betiğinden bu tür bir kullanım buldum, bunu Github'da bulabilirsiniz. Evet, içinde dosya bulamıyorum /dev/tcp, hatta /dev/tcpkendini bulamıyorum . Ancak, veri gönderebileceğiniz / alabileceğiniz özel bir kullanım pipeve bu tür dosyalar gibi görünüyor. /dev/tcp/ip/portTCP bağlantıları ve /dev/udp/ip/portudp paketleri için kullanıldığı söylenir . İngilizcem çok iyi olmadığından, doğru bir şekilde nasıl açıklayacağımı bilmiyorum. Lütfen soruyu düzenlemek ve bir cevap göndermek için çekinmeyin.
TJM

@TJM teşekkürler. Soru, pipebahsettiğiniz komutla ilgiliydi . Baktım https://github.com/clsr/sedbot/blob/master/sedbot.bash. Orada pipeemir yok. İki işlevi tanımlar: readmsgve sendmsgsırasıyla bağlantıdan / bağlantıya okuma / yazma. readmsgkullanımları IFS= read -r -u 3 -t "$READ_TIMEOUT" linedeğişkene dosya tanımlayıcısı 3 okuma lineve sendmsgkullanımları echo "$(date +%s.%N) >>> $line" >&4tam yöntem Neyse dosya tanımlayıcı 4. içine yazma için bu temizlemekte. " pipeKomut" sözü okuyuculara hala bir sır olarak kalıyor.
arielf

Yanıtlar:


18

Bu komut, dosya tanımlayıcı 3'te bağlantıyı açtı. Bu nedenle bağlantıyı kapatmak için dosya tanımlayıcı 3'ü kapatmanız gerekir. Bunu yapmak için:

exec 3<&-

1
Bu uygun bir shutdown(3)çağrı close(2)mı yoksa sadece dosya tanımlayıcı mı?
Kevin

A yapar close, ancak shutdownyakın olmaktan daha uygun değildir. shutdownsadece gerçek kullanım bir dubleks soket sadece bir tarafını kapatmak istediğinizde.
Patrick


2
@Kevin RST, soketin ilk olarak tüm verileri okumadan kapatılmasıyla oluşur. Verilerin sonuna okuduysanız ve sonra kapanırsanız, kapanış bir FIN gönderir.
kasperd

@kasperd: UNIX soket API'sinde, beklemede olan veri olup olmadığını bilmenin tek yolu ya engellemeyen bir soketten okumaya çalışmak ya da benzer bir şeyi çağırmaktır select()ve bash'ın her iki seçenek için de sağladığına inanmıyorum.
Kevin
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.