Як припинити TCP-з'єднання, встановлене самим bash?


17

Я використовував exec 3<>/dev/tcp/192.168.0.101/6435для встановлення TCP-з'єднання з 192.168.0.101:6435. І я отримав так само, як надіслав кілька повідомлень із pipeкомандою.

Тепер я хочу припинити TCP-з'єднання. Але, ss -anpetя можу бачити, що баш сам тримає цей зв'язок, не змушуючи дочірнього процесу.

Я намагався надіслати сигнали 9 і 15 до процесу баш, але, як відомо, баш не може себе вбити.

Отже, чи можу я припинити встановлене мною з'єднання TCP, не припиняючи очки, які я використовую (ні вбиваючи його коренем, ні надсилаючи Ctrl + D)?


Не могли б ви отримати ще одну снаряд і вбити bashз цією оболонкою?
трис

3
bashбезумовно, можна вбити себе, хоча це насправді не те, що ви хочете зробити тут!
psmears

@TJM, щоб зробити це захоплююче питання більш корисним для інших, чи можете ви, будь ласка, детальніше розглянути pipeкоманду, яку ви використовуєте, і яку я не можу знайти у своїй системі? З якого пакету pipeвиходить? Які (приклад) параметри ви можете передати йому для надсилання / отримання даних через /dev/tcp/...з'єднання? Спасибі.
аріельф

@arielf Як правило, я початківець з інформатики, і я знайшов таке використання в скрипті bash shell під назвою sedbot, його можна знайти в Github. Так, я не можу знайти жодного файлу /dev/tcp, навіть не можу знайти /dev/tcpсебе. Але, схоже, особливе використання, з яким ви можете надсилати / отримувати дані pipeта файли подібного типу. Кажуть, що використовувати /dev/tcp/ip/portдля tcp-з'єднань та /dev/udp/ip/portudp-пакетів. Бо моя англійська не дуже гарна, я не знаю, як це правильно пояснити. Будь ласка, відредагуйте питання та опублікуйте відповідь.
TJM

@TJM спасибі Питання стосувалося pipeкоманди, яку ви згадуєте. Я подивився https://github.com/clsr/sedbot/blob/master/sedbot.bash. Там немає ніякої pipeкоманди. Він визначає дві функції: readmsgі sendmsgчитати / записувати з / до з'єднання відповідно. readmsgвикористовує IFS= read -r -u 3 -t "$READ_TIMEOUT" lineдля читання з файлового дескриптора 3 у змінну lineта sendmsgвикористовує echo "$(date +%s.%N) >>> $line" >&4для запису у дескриптор файлу 4. У будь-якому випадку це пояснює повний метод. pipeЗгадка про " командування" все ще залишається загадкою для читачів.
аріельф

Відповіді:


18

Ця команда відкрила з'єднання в дескрипторі файлів 3. Отже, щоб закрити з'єднання, потрібно закрити дескриптор файлу 3. Для цього:

exec 3<&-

1
Це буде робити належний shutdown(3)виклик чи просто close(2)дескриптор файлу?
Кевін

Чи є close, але shutdownне є більш правильним, ніж близьким. shutdownЄдине реальне використання - це коли ви хочете закрити лише одну сторону дуплексного гнізда.
Патрік


2
@Kevin RST викликається закриттям сокета, не спочатку зчитуючи з нього всі дані. Якщо ви прочитаєте дані до кінця, а потім закриєте, закриття надішле FIN.
kasperd

@kasperd: В інтерфейсі API сокетів UNIX єдиний спосіб дізнатися, чи є очікування даних, - це або спробувати прочитати з неблокуючого сокета, або зателефонувати на щось подібне select(), і я не вважаю, що bash передбачає жоден варіант.
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.