Bagaimana cara mengakhiri koneksi TCP yang dibuat oleh bash sendiri?


17

Saya telah terbiasa exec 3<>/dev/tcp/192.168.0.101/6435membuat koneksi TCP dengan 192.168.0.101:6435. Dan saya telah menerima serta mengirim beberapa pesan dengan pipeperintah tersebut.

Sekarang, saya ingin mengakhiri koneksi TCP. Tapi, dengan ss -anpetsaya dapat melihat bahwa bash sendiri memegang koneksi ini, tanpa mengacaukan proses anak.

Saya mencoba mengirim sinyal 9 dan 15 ke proses bash, tetapi seperti yang Anda tahu, bash tidak dapat mematikan dirinya sendiri.

Jadi, dapatkah saya mengakhiri koneksi TCP yang telah saya buat tanpa mengakhiri pts yang saya gunakan (tidak membunuhnya dengan root atau mengirim Ctrl + D)?


Bisakah Anda mendapatkan shell lain & membunuh bashdengan shell itu?
trysis

3
bashtentu saja dapat membunuh dirinya sendiri - meskipun itu sebenarnya bukan yang ingin Anda lakukan di sini!
psmears

@TJM untuk membuat pertanyaan yang menarik ini lebih bermanfaat bagi orang lain, bisakah Anda menjelaskan pipeperintah yang Anda gunakan dan yang tidak dapat saya temukan di sistem saya? Paket mana yang pipeberasal? Apa (contoh) parameter yang dapat Anda berikan untuk mengirim / menerima data melalui /dev/tcp/...koneksi? Terima kasih.
arielf

@diri sendiri Biasanya, saya pemula Ilmu Komputer, dan saya menemukan jenis penggunaan ini dari skrip bash shell yang disebut sedbot, Anda dapat menemukannya di Github. Ya, saya tidak dapat menemukan file apa pun /dev/tcp, bahkan tidak dapat menemukan /dev/tcpdirinya sendiri. Tapi, sepertinya penggunaan khusus yang Anda dapat mengirim / menerima data dengan pipedan jenis file ini. Dikatakan bahwa digunakan /dev/tcp/ip/portuntuk koneksi tcp, dan /dev/udp/ip/portuntuk paket udp. Karena bahasa Inggris saya tidak terlalu baik, saya tidak tahu bagaimana menjelaskannya dengan benar. Silakan mengedit pertanyaan dan mengirim jawaban.
TJM

@TJM terima kasih. Pertanyaannya adalah tentang pipeperintah yang Anda sebutkan. Saya melihat https://github.com/clsr/sedbot/blob/master/sedbot.bash. Tidak ada pipeperintah di sana. Ini mendefinisikan dua fungsi: readmsgdan masing-masing sendmsguntuk membaca / menulis dari / ke koneksi. readmsgdigunakan IFS= read -r -u 3 -t "$READ_TIMEOUT" lineuntuk membaca dari file-deskriptor 3 ke dalam variabel line, dan sendmsgdigunakan echo "$(date +%s.%N) >>> $line" >&4untuk menulis ke file deskriptor 4. Bagaimanapun, ini menjelaskan metode lengkap. The " pipeperintah" menyebutkan masih tetap menjadi misteri bagi pembaca.
arielf

Jawaban:


18

Perintah itu membuka koneksi pada deskriptor file 3. Jadi untuk menutup koneksi, Anda perlu menutup deskriptor file 3. Untuk melakukannya:

exec 3<&-

1
Apakah ini akan melakukan shutdown(3)panggilan yang tepat , atau hanya close(2)deskriptor file?
Kevin

Apakah close, tetapi shutdowntidak lebih tepat dari dekat. shutdownSatu-satunya penggunaan nyata adalah ketika Anda hanya ingin menutup satu sisi soket dupleks.
Patrick

4
A shutdownmengirimkan FIN, sedangkan closemengirimkan RST. Ini adalah hal-hal yang berbeda secara material.
Kevin

2
@Kevin RST disebabkan oleh penutupan soket tanpa membaca semua data darinya terlebih dahulu. Jika Anda membaca hingga akhir data dan kemudian melakukan penutupan, penutupan akan mengirimkan FIN.
kasperd

@kasperd: Di UNIX socket API, satu-satunya cara untuk mengetahui apakah ada data yang tertunda adalah dengan mencoba membaca dari soket yang nonblocking, atau memanggil sesuatu seperti select(), dan saya tidak percaya bash menyediakan untuk kedua opsi tersebut.
Kevin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.