O Bash fornece pseudo-dispositivos com os quais você provavelmente está familiarizado, como /dev/null
. No entanto, existem outros dispositivos, como /dev/tcp
e /dev/udp
, para testar as conexões de rede, que você também pode usar nos scripts Bash.
Bash handles several filenames specially when they are used in redirections, as described in the following table:
/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.
Exemplo
Aqui estou testando a conexão com um host no meu domínio chamado skinner e vendo se consigo conectar à sua porta 22.
NOTA: A porta 22 é para SSH, para a porta 23 do uso do telnet.
$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up
Ótimo, então vamos tentar um não-port:
$ 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
Bem, isso funciona, mas é uma saída horrivelmente feia. Não se preocupe. Você pode executar o echo > /dev/tcp/...
em um subshell e redirecionar toda a saída para /dev/null
para limpá-lo um pouco. Aqui está o padrão que você pode usar nos seus 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