I'm procurando por um método rápido e simples para testar corretamente se uma determinada porta TCP está aberta em um servidor remoto, de dentro de um script Shell.
I'consegui fazê-lo com o comando telnet, e funciona bem quando a porta é aberta, mas não'não parece haver timeout quando'não é e apenas fica pendurado lá...
Aqui's uma amostra:
l_TELNET=`echo "quit" | telnet $SERVER $PORT | grep "Escape character is"`
if [ "$?" -ne 0 ]; then
echo "Connection to $SERVER on port $PORT failed"
exit 1
else
echo "Connection to $SERVER on port $PORT succeeded"
exit 0
fi
Eu preciso de uma maneira melhor, ou uma maneira de forçar o telnet a ficar sem tempo se ele não'não conectar em menos de 8 segundos, por exemplo, e devolver algo que eu possa pegar no Shell (código de retorno, ou string em stdout).
Eu conheço o método Perl, que usa o módulo IO::Socket::INET e escreveu um script bem sucedido que testa uma porta, mas gostaria de evitar o uso do Perl se possível.
Nota: Isto é o que meu servidor está rodando (de onde eu preciso rodar isto)
SunOS 5.10 Genéricos_139556-08 i86pc i386 i86pc
Como apontado por B. Rhodes, nc
vai fazer o trabalho. Uma maneira mais compacta de utilizá-lo:
nc -z <host> <port>
Dessa forma o nc
só vai verificar se a porta está aberta, saindo com 0 no sucesso, 1 no fracasso.
Para uma verificação rápida e interactiva (com um tempo limite de 5 segundos):
nc -z -v -w5 <host> <port>
Com o netcat
você pode verificar se uma porta está aberta desta forma:
nc my.example.com 80 < /dev/null
O valor de retorno do `nc' será um sucesso se a porta TCP foi aberta, e uma falha (tipicamente o código de retorno 1) se ela não conseguir fazer a conexão TCP.
Algumas versões do nc
serão penduradas quando você tentar isso, porque elas não fecham a metade do soquete de envio mesmo depois de receber o final do arquivo de /dev/null'. No meu próprio laptop Ubuntu (18.04), a versão
netcat-openbsd' do netcat que eu instalei oferece uma alternativa: a opção `-N' é necessária para obter um resultado imediato:
nc -N my.example.com 80 < /dev/null
I'acho que é tarde demais para uma resposta, e esta pode não ser uma boa resposta, mas aqui está...
Que tal colocá-lo dentro de um laço com um temporizador de algum tipo. I'sou mais do tipo Perl do que Solaris, mas dependendo da concha que você'está usando, você deve ser capaz de fazer algo como:
TIME = 'date +%s' + 15
while TIME != `date +%s'
do whatever
E depois basta adicionar uma bandeira no loop while, para que, se ela se esgotar antes de completar, você possa citar o timeout como motivo para o fracasso.
Suspeito que o telnet também tem um interruptor de tempo limite, mas, logo no topo da minha cabeça, acho que o acima vai funcionar.