Bash proporciona pseudo dispositivos con los que probablemente esté familiarizado, como /dev/null
. Sin embargo, existen otros dispositivos como /dev/tcp
y /dev/udp
para probar las conexiones de red, que también puede usar desde los scripts de Bash.
extracto de la página de manual de Bash
Bash maneja varios nombres de archivo especialmente cuando se usan en redirecciones, como se describe en la siguiente tabla:
/dev/fd/fd
If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
File descriptor 0 is duplicated.
/dev/stdout
File descriptor 1 is duplicated.
/dev/stderr
File descriptor 2 is duplicated.
/dev/tcp/host/port
If host is a valid hostname or Internet address, and port
is an integer port number or service name, bash attempts to
open a TCP connection to the corresponding socket.
/dev/udp/host/port
If host is a valid hostname or Internet address, and port
is an integer port number or service name, bash attempts to
open a UDP connection to the corresponding socket.
Ejemplo
Aquí estoy probando la conexión a un host en mi dominio llamado skinner y viendo si puedo conectarme a su puerto 22.
NOTA: El puerto 22 es para SSH, para telnet use el puerto 23.
$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up
Genial, así que intentemos con un no puerto:
$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down
Bueno, eso funciona, pero es una salida muy fea. No es para preocuparse. Puede ejecutarlo echo > /dev/tcp/...
en una subshell y redirigir toda la salida /dev/null
para limpiarlo un poco. Aquí está el patrón que puede usar dentro de sus scripts de shell:
$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
&& echo "it's up" || echo "it's down"
it's up
$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
&& echo "it's up" || echo "it's down"
it's down