Olá,
Sempre que precisava fazer algum teste pra validar se um servidor ou serviço remoto esta “escutando” em uma porta especifica, me recomendavam o Telnet, que é uma solução nativa do Windows apesar de precisar ser instalado como funcionalidade extra nas versões Client do Windows. O que sempre me incomodou foi o formato do output que vinha em string, então tratar o retorno do Telnet sempre foi uma “tarefa não grata” em scripts. Entre as versões 3.0 e 5.1 do Windows
Powershell temos o Test-NetConnection que pode ser utilizado para testar serviços remotos sendo possivel especificar a porta, diferentemente do Ping:
Test-NetConnection -ComputerName guidooliveira.com -Port 443
Na versão 6.0 do Microsoft Powershell entretando, esse comando não esta mais presente, e no caso de automações rodando em um servidor linux, o uso desse comando é inviavel, mas podemos contornar isso utilizando um script simples que utiliza a classe System.Net.Sockets.TcpClient para fazer um teste de conectividade, sendo possivel especificar o tempo de timeout da requisição. O retorno desse script indica se a conexão foi aceita com sucesso na porta especificada, entretanto este exemplo não especifica parâmetros de credencial para validar a resposta, apenas se a conexão TCP esta ativa, como é o caso do Test-NetConnection.
Instanciamos o objeto $TCPClient e em seguida chamamos o método BeginConnect() especificando na primeira posição o host remoto, na segunda posição a porta para conexão e os dois últimos parametros como nulo. Caso deseje saber melhor como a classe funciona pode verificar na documentação oficial System.Net.Sockets.TcpClient.
Após inciciar o teste de conexão iremos aguardar o retorno de forma assíncrona especificando o timeout de 1 segundo, especificado em milisegundos no primeiro argumento. Ao validar o retorno podemos determinar se a conexão foi feita ou não com sucesso e chamar o método Close() e Dispose() para liberar os recursos de memória alocados para o objeto, evitando assim algum vazamento de memória.
$TCPClient = New-Object -TypeName System.Net.Sockets.TcpClient
$Connection = $TCPClient.BeginConnect('guidooliveira.com','443',$null,$null)
$Wait = $Connection.AsyncWaitHandle.WaitOne('1000',$false)
if(-not($wait)){
$tcpobject.Close()
[PSCustomObject]@{
Online = $false
Message = 'Timeout'
}
}
else{
try {
$null = $TCPClient.EndConnect($Connection)
[PSCustomObject]@{
Online = $true
Message = 'Connection Succeeded'
}
}
catch {
[PSCustomObject]@{
Online = $false
Message = 'Timeout'
}
}
$TCPClient.Close()
}
$TCPClient.Dispose()
Espero que tenha aprendido a fazer testes de conexão remota em portas especificas tanto em windows clients quanto em servidores Linux com o powershell Core.
Dúvidas, Sugestões? Comente!
Até a próxima!
3 Comments
up
up
up