O Bash fornece pseudo-dispositivos com os quais você provavelmente já conhece /dev/null
. No entanto, existem outros dispositivos, como /dev/tcp
e /dev/udp
para testar conexões de rede, que você também pode usar nos scripts do Bash.
trecho da página de manual do Bash
O Bash lida com vários nomes de arquivos, especialmente quando eles são usados em redirecionamentos, conforme descrito na tabela a seguir:
/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 telnet use a porta 23.
$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up
Ótimo, então vamos tentar uma não porta:
$ 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 terrivelmente feia. Não se preocupe. Você pode executar o echo > /dev/tcp/...
subshell e redirecionar toda a saída /dev/null
para limpá-la um pouco. Aqui está o padrão que você pode usar em 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