Este é um recurso do ATT ksh93 que foi adicionado no bash 2.04 . Nenhuma das outras shells comuns a possui, em particular você não a encontrará em nenhuma das variantes do traço, em pdksh ou mksh (a partir de julho de 2015), em qualquer das variantes BusyBox ou Android, ou em zsh¹ ou fish. O Bash pode ser compilado sem esse recurso (consulte --enable-net-redirections
), por isso pode estar ausente de dispositivos incorporados, mesmo que tenham bash.
Para testar se o recurso está presente, você pode verificar a mensagem de erro ao tentar abrir uma porta TCP para o serviço de descarte : tanto bash quanto ksh dizem "Connection refused" (ou o comando retorna imediatamente se você tiver um serviço de descarte em sua máquina local), o que você não veria se isso não tentasse fazer alguma conexão de rede.
: </dev/tcp/127.0.0.1/9
Um dos motivos pelos quais isso não é uma característica comum é que muitos protocolos de rede exigem comunicação bidirecional com o tratamento cuidadoso de quem fala quando, para os quais os shells não são muito convenientes. Outra razão é que, para os casos simples, tubos envolvendo netcat , socat ou socket também funcionam. Esses programas lidam com dados binários e podem ser servidores e clientes. A maioria dos protocolos que podem ser manipulados de maneira simples possui ferramentas especializadas, excetuando-se a LAN sem fio.
echo -e "GET / HTTP/1.1\n\n" | nc www.google.com 80
echo -e "GET / HTTP/1.1\n\n" | socat - TCP:www.google.com:80
( socket
não funciona realmente como um cliente HTTP, pois não fecha a gravação da conexão no final da entrada).
Para scripts:
case $(export LANGUAGE=C LC_ALL=C; { : </dev/tcp/127.0.0.1/9; } 2>&1) in
""|*"Connection refused"*) echo "/dev/tcp is present";;
*)
if type nc >/dev/null 2>/dev/null; then
echo "netcat is present"
elif type socat >/dev/null 2>/dev/null; then
echo "socat is present"
else
echo "I can't do TCP"
fi
esac
¹ O Zsh tem uma maneira diferente de usar soquetes UDP e TCP.