¿Están / dev / {udp, tcp} estandarizados o disponibles en todas partes?

17

Recientemente he aprendido sobre los /dev/udpy /dev/tcppseudodispositivos aquí . ¿Son específicos de algunas distribuciones de GNU / Linux o puedo encontrarlos en otros sistemas Unix?

¿Están estandarizados de alguna manera?

Hasta ahora, he podido usarlos con éxito en OS X, Arch Linux y CentOS.

Antoine
fuente

Respuestas:

26

Esta es una característica del shell y no del sistema operativo.

Entonces, por ejemplo, en Solaris 10 con ksh88como shell:

% cat < /dev/tcp/localhost/22
ksh: /dev/tcp/localhost/22: cannot open

Sin embargo, si cambiamos a bash:

% bash
bash-3.2$ cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_1.1.5

Entonces bashinterpreta el /dev/tcppero ksh88 no lo hizo.

En Solaris 11 con ksh93como shell:

% cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_2.2

Entonces podemos ver que depende mucho del shell en uso.

Stephen Harris
fuente
44
También depende de las opciones de tiempo de compilación: no todas las compilaciones de bash lo habilitarán.
Charles Duffy
@CharlesDuffy Es cierto; también es cierto para ksh (ksh-88 intentó autodetectarse, pero no estoy seguro de que funcionó correctamente).
Stephen Harris
1
Con respecto a la primera oración, POSIX estandariza algunas características básicas del shell (aunque /dev/tcp/...no es una de ellas).
Tanz87
3

Para agregar, desde el nodo Bash Info :

Bash maneja varios nombres de archivo especialmente cuando se usan en redirecciones, como se describe en la siguiente tabla. Si el sistema operativo en el que se ejecuta Bash proporciona estos archivos especiales, bash los usará; de lo contrario, los emulará internamente con el comportamiento que se describe a continuación.

'/ dev / fd / FD' Si FD es un número entero válido, el descriptor de archivo FD está duplicado.

'/ dev / stdin' El descriptor de archivo 0 está duplicado.

'/ dev / stdout' El descriptor de archivo 1 está duplicado.

'/ dev / stderr' El descriptor de archivo 2 está duplicado.

'/ dev / tcp / HOST / PORT' Si HOST es un nombre de host o una dirección de Internet válidos, y PORT es un número de puerto entero o un nombre de servicio, Bash intenta abrir el socket TCP correspondiente.

'/ dev / udp / HOST / PORT' Si HOST es un nombre de host o una dirección de Internet válidos, y PORT es un número de puerto entero o nombre de servicio, Bash intenta abrir el socket UDP correspondiente.

extremeaxe5
fuente