¿Cómo terminar una conexión TCP establecida por bash?

17

Solía exec 3<>/dev/tcp/192.168.0.101/6435establecer una conexión TCP con 192.168.0.101:6435. Y he recibido y enviado algunos mensajes con el pipecomando.

Ahora, quiero terminar la conexión TCP. Pero, ss -anpetpuedo ver que bash mismo mantiene esta conexión, sin bifurcar un proceso hijo.

Intenté enviar las señales 9 y 15 al proceso bash, pero como saben, bash no puede suicidarse.

Entonces, ¿puedo terminar la conexión TCP que he establecido sin terminar los pts que estoy usando (ni matarla por root ni enviar Ctrl + D)?

TJM
fuente
¿Podría obtener otro caparazón y matar bashcon ese caparazón?
trysis
3
bashsin duda puede suicidarse, ¡aunque eso no es realmente lo que quieres hacer aquí!
psmears
@TJM para que esta fascinante pregunta sea más útil para otros, ¿podría explicar el pipecomando que está utilizando y que no puedo encontrar en mi sistema? ¿De qué paquete pipeviene? ¿Qué parámetros (de ejemplo) puede pasarle para enviar / recibir datos a través de la /dev/tcp/...conexión? Gracias.
arielf
@arielf Por lo general, soy un principiante en Ciencias de la Computación, y encontré este tipo de uso de un script de shell bash llamado sedbot, puedes encontrarlo en Github. Sí, no puedo encontrar ningún archivo /dev/tcp, ni siquiera puedo encontrarlo /dev/tcp. Pero, parece un uso especial con el que puede enviar / recibir datos pipey este tipo de archivos. Se dice que se usa /dev/tcp/ip/portpara conexiones tcp y /dev/udp/ip/portpara paquetes udp. Para mi inglés no es muy bueno, no sé cómo explicarlo correctamente. Por favor, siéntase libre de editar la pregunta y publicar una respuesta.
TJM
@TJM gracias. La pregunta era sobre el pipecomando que mencionas. La miré https://github.com/clsr/sedbot/blob/master/sedbot.bash. No hay pipecomando allí. Define dos funciones: readmsgy sendmsgleer / escribir desde / hacia la conexión respectivamente. readmsgusa IFS= read -r -u 3 -t "$READ_TIMEOUT" linepara leer desde el descriptor de archivo 3 en la variable line, y sendmsgusa echo "$(date +%s.%N) >>> $line" >&4para escribir en el descriptor de archivo 4. De todos modos, esto aclara el método completo. La pipemención de " comando" sigue siendo un misterio para los lectores.
arielf

Respuestas:

18

Ese comando abrió la conexión en el descriptor de archivo 3. Por lo tanto, para cerrar la conexión, debe cerrar el descriptor de archivo 3. Para hacerlo:

exec 3<&-
Patricio
fuente
1
¿Esto hará una shutdown(3)llamada adecuada , o solo close(2)el descriptor de archivo?
Kevin
Hace un close, pero shutdownno es más apropiado que cercano. shutdownEl único uso real es cuando solo desea cerrar un lado de un zócalo dúplex.
Patrick
44
A shutdownenvía un FIN, mientras que a closeenvía un RST. Estas son cosas materialmente diferentes.
Kevin
2
@Kevin RST se produce al cerrar el socket sin leer primero todos los datos. Si lee hasta el final de los datos y luego realiza un cierre, el cierre enviará un FIN.
kasperd
@kasperd: en la API de socket de UNIX, la única forma de saber si hay datos pendientes es intentar leer desde un socket sin bloqueo o llamar a algo así select(), y no creo que bash proporcione ninguna de las opciones.
Kevin