Làm cách nào để chấm dứt kết nối TCP được thiết lập bằng chính bash?


17

Tôi đã sử dụng exec 3<>/dev/tcp/192.168.0.101/6435để thiết lập kết nối TCP với 192.168.0.101:6435. Và tôi đã nhận được cũng như gửi một vài tin nhắn với pipelệnh.

Bây giờ, tôi muốn chấm dứt kết nối TCP. Nhưng, với ss -anpettôi có thể thấy rằng chính bash giữ kết nối này, mà không cần xử lý một tiến trình con.

Tôi đã cố gửi tín hiệu 9 và 15 đến quy trình bash, nhưng như bạn biết, bash không thể tự chết.

Vì vậy, tôi có thể chấm dứt kết nối TCP mà tôi đã thiết lập mà không chấm dứt các pts tôi đang sử dụng (không giết chết nó bằng root cũng không gửi Ctrl + D)?


Bạn có thể lấy một cái vỏ khác và giết bashvới cái vỏ đó không?
phân tích

3
bashchắc chắn có thể tự sát - mặc dù đó không thực sự là những gì bạn muốn làm ở đây!
psmears

@TJM để làm cho câu hỏi hấp dẫn này trở nên hữu ích hơn với người khác, bạn có thể giải thích rõ hơn về pipelệnh bạn đang sử dụng và tôi không thể tìm thấy trên hệ thống của mình không? Gói nào pipeđến từ đâu? Những thông số (ví dụ) nào bạn có thể truyền cho nó để gửi / nhận dữ liệu qua /dev/tcp/...kết nối? Cảm ơn.
arielf

@arielf Thông thường, tôi là người mới bắt đầu học Khoa học Máy tính và tôi đã tìm thấy cách sử dụng này từ tập lệnh bash shell có tên là sedbot, bạn có thể tìm thấy nó trên Github. Có, tôi không thể tìm thấy bất kỳ tập tin nào /dev/tcp, thậm chí không thể tìm thấy /dev/tcpchính nó. Nhưng, có vẻ như một cách sử dụng đặc biệt mà bạn có thể gửi / nhận dữ liệu cùng với pipeloại tệp này. Người ta nói rằng sử dụng /dev/tcp/ip/portcho các kết nối tcp, và /dev/udp/ip/portcho các gói udp. Đối với tiếng Anh của tôi không tốt lắm, tôi không biết giải thích thế nào cho đúng. Xin vui lòng chỉnh sửa câu hỏi và gửi câu trả lời.
TJM

@TJM cảm ơn. Câu hỏi là về pipelệnh mà bạn đề cập. Tôi nhìn https://github.com/clsr/sedbot/blob/master/sedbot.bash. Không có pipelệnh ở đó. Nó định nghĩa hai chức năng: readmsgsendmsgđể đọc / ghi từ / đến kết nối tương ứng. readmsgsử dụng IFS= read -r -u 3 -t "$READ_TIMEOUT" lineđể đọc từ mô tả tệp 3 vào biến linesendmsgsử dụng echo "$(date +%s.%N) >>> $line" >&4để ghi vào mô tả tệp 4. Dù sao, điều này làm rõ phương thức đầy đủ. " pipeLệnh" đề cập vẫn còn là một bí ẩn đối với độc giả.
thân

Câu trả lời:


18

Lệnh đó đã mở kết nối trên bộ mô tả tệp 3. Vì vậy, để đóng kết nối, bạn cần đóng bộ mô tả tệp 3. Để làm như vậy:

exec 3<&-

1
Điều này sẽ thực hiện một shutdown(3)cuộc gọi thích hợp , hoặc chỉ close(2)mô tả tập tin?
Kevin

Có một close, nhưng shutdownkhông thích hợp hơn gần gũi. shutdownChỉ sử dụng thực sự là khi bạn chỉ muốn đóng một bên của ổ cắm song công.
Patrick

4
A shutdowngửi FIN, trong khi a closegửi RST. Đây là những thứ khác nhau về vật chất.
Kevin

2
@Kevin RST là do đóng ổ cắm mà không đọc tất cả dữ liệu từ nó trước. Nếu bạn đọc đến cuối dữ liệu và sau đó đóng lại, đóng sẽ gửi FIN.
kasperd

@kasperd: Trong API ổ cắm UNIX, cách duy nhất để biết liệu có dữ liệu đang chờ xử lý hay không là cố gắng đọc từ ổ cắm không chặn hoặc gọi một cái gì đó như select(), và tôi không tin bash cung cấp tùy chọn nào.
Kevin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.