¿Qué sistema tipo Unix realmente proporciona el archivo especial / dev / tcp?

9

Sé que /dev/tcp/<host>/<port>es un camino mágico manejado específicamente por algunos proyectiles en las redirecciones. Pero según man bash:

Si el sistema operativo en el que se ejecuta bash proporciona estos archivos especiales, bash los usará; de lo contrario los emulará internamente [...]

En el cuadro de Linux que estoy usando en este momento, el /dev/tcparchivo especial no está presente, por lo que Bash lo emulará . Pero, ¿existe realmente un sistema similar a Unix que proporcione el /dev/tcparchivo especial con la misma semántica que el que admite Bash?

Sylvain Leroux
fuente
Requeriría un directorio emulado. Hacer directorios emulados solo es posible con sistemas de archivos específicos, por ejemplo, procfs o sysfs pueden hacerlo. /deves un tmpfs en los linux actuales, y estaba en la partición raíz en los más antiguos. Por eso es imposible actualmente. Podría hacerse posible fácilmente con una extensión sysfs o procfs (ambos fs son muy flexibles y similares (en realidad, probablemente nadie sabe por qué no son iguales)), nadie lo hace hoy, pero podría hacerse en alrededor de 100 líneas de código.
peterh - Restablece a Mónica el
Pero, ¿hay algún otro sistema operativo que ya lo haga? En algún momento, pensé que el Plan 9 lo hizo pero estaba equivocado.
Sylvain Leroux
1
No sé, probablemente no (hasta donde sé, es un invento de bash). He votado tu pregunta, porque la respuesta también es interesante para mí. Hasta donde sé, ningún sistema operativo Unix con capacidad x86 popular puede hacer esto.
peterh - Restablecer Monica

Respuestas:

8

Creo que la documentación de Bash es algo engañosa sobre este tema. Mirando el código, incluso volviendo a la versión 2.04 donde se introdujeron las redirecciones de red, /dev/tcpy /dev/udpfunciona de la siguiente manera:

  • en el momento de la compilación, el configurescript verifica si se admiten varias funciones de red; si es así, si las redirecciones de red están habilitadas (que es el caso por defecto), el código de red interno está integrado;
  • en tiempo de ejecución, si el código de red interno está integrado /dev/tcpy /dev/udp(en el formato correcto) se maneja internamente; de lo contrario, se genera una advertencia (“/ dev / (tcp | udp) / host / port no es compatible sin conexión en red”) y Bash intenta abrir la ruta dada en el sistema;
  • Si las redirecciones de red están configuradas, no se hace nada especial.

Esto se reduce a:

  • Si la redirección de red está habilitada:
    • si las redes son compatibles con la plataforma de destino /dev/tcpy /dev/udpsiempre se manejarán internamente;
    • de lo contrario, Bash advertirá e intentará abrir el archivo "a ciegas"; si el sistema de alguna manera es compatible /dev/(tcp|udp)/host/port, se utilizará, de lo contrario con toda probabilidad la redirección fallará;
  • si la redirección de red está deshabilitada, no se realiza ningún manejo especial; como anteriormente, si el sistema de alguna manera es compatible /dev/(tcp|udp)/host/port, se utilizará, de lo contrario, con toda probabilidad, la redirección fallará.

/dev/tcpexiste en algunos sistemas, pero que yo sepa, ninguno admite la misma abstracción que Bash. En Solaris, /dev/tcpse usa con la nddherramienta para consultar y cambiar la configuración de red. En XTI (vea también Open Group si es miembro), la t_openfunción se puede usar /dev/tcppara abrir una conexión TCP, pero no usa la configuración basada en rutas, hay una estructura de datos separada para especificar el host de destino y puerto (y otros parámetros).

Stephen Kitt
fuente
La característica en sí proviene de ksh93. / dev / tcp en sistemas SysV sería un controlador en el módulo tcp STREAMS .
Stéphane Chazelas