Verifique o status de uma porta no host remoto [fechado]

158

Eu preciso de uma linha de comando que possa verificar o status da porta em um host remoto. Eu tentei, ping xxx.xxx.xxx.xxx:161mas ele não reconhece o "host". Eu pensei que era uma resposta "boa" até que fiz o mesmo comando contra um host que eu sei que tem essa porta aberta. Isso é para um arquivo em lotes no Windows que verificará o status da porta remota e executará um comando que usa essa porta remota para obter informações, depois o comando remote port check novamente e, em seguida, o comando que usa essa porta no próximo servidor para obter informações. , e assim por diante. Eu olhei em todos os lugares e pensei que o ping pudesse fazer isso, mas deve haver várias versões do ping, suponho que o servidor em que estou fazendo isso não mostre essa opção.

Apenas para rir, tentei um verificador de porta remota baseado na Web a partir de um site - e os resultados estavam corretos para o servidor "problemático" e o servidor correto. No entanto, não posso usá-lo em lotes executados com mais de 500 IPs de servidor.

Existe algo que eu possa fazer que seja simples? Minhas habilidades em Perl são extremamente enferrujadas (use ou perca), não conheço outros idiomas baseados no Windows, exceto lote. Unix é minha habilidade, mas isso deve ser executado no Widows Server 2003.

Ross Ridge
fonte
5
Você pode tentar perguntar isso em serverfault.com
John Rasch
1
Como esta pergunta foi encerrada, eu respondi aqui
npocmaka
janelas ps> tnc xxx.xxx.xxx.xxx -port 161
Shahsavan muçulmano

Respostas:

151

Parece que você está procurando um scanner de porta como o nmap ou o netcat , ambos disponíveis para Windows, Linux e Mac OS X.

Por exemplo, verifique se há telnet em um ip conhecido:

nmap -A 192.168.0.5/32 -p 23

Por exemplo, procure portas abertas de 20 a 30 em host.example.com:

nc -z host.example.com 20-30
Glenn
fonte
Ambos estão disponíveis para Windows.
Glenn
1
seu comando nmap deve "-p23" real sem o espaço. trata nmap cada unidade não imediatamente precedido por uma bandeira como um destino de digitalização separado
Brandon Lebedev
14
deveria ser nc -zv host.example.com 20-30. caso contrário, não há saída.
Aryeh Beitz 22/11
1
A opção -zpara ncnão está disponível no Linux.
Valentin_nasta
1
@valentin_nasta sim, é, talvez dependendo da versão do netcat que você está usando (gnu ou openbsd). Aqui está a linha relevante da página de manual do nc (versão openbsd) no meu sistema Arch linux: -z Especifica que o nc deve apenas procurar daemons que estão escutando, sem enviar nenhum dado para eles. É um erro usar esta opção em conjunto com a opção -l
pgoetz 4/18
126

No prompt de comando, você pode usar o comando telnet. Por exemplo, para conectar-se ao IP 192.168.10.1 com porta 80,

telnet 192.168.10.1 80

Para ativar o telnet no Windows 7 e superior, clique em . No artigo vinculado, ative o telnet através do painel de controle -> programas e recursos -> recursos do Windows -> cliente telnet ou apenas execute-o em um prompt de administrador:

dism /online /Enable-Feature /FeatureName:TelnetClient
Naveen Yedugani
fonte
3
Este é o método mais fácil se o telnet estiver instalado no dispositivo Windows
shonky linux user
30
... e leva 2 segundos para adicioná-lo ao Windows (8.1 no meu caso)> Painel de controle> Adicionar programas> Ativar recursos do Windows
Chris Moutray
14
Apenas para informações: se a porta não estiver aberta: Conectando a ##### ... Não foi possível abrir a conexão com o host, na porta ####: Falha na conexão; E se a porta está aberta, você vai acabar em telnet (CTRL +], em seguida, 'sair')
blackstrype
27

Para fins de script, descobri que o curlcomando pode fazê-lo, por exemplo:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Possivelmente, pode não funcionar para todos os serviços, pois curlpode retornar códigos de erro diferentes em alguns casos (conforme comentário), portanto, a adição da seguinte condição pode funcionar de maneira confiável:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Nota: Adicionado -m5para definir o tempo limite máximo de conexão de 5 segundos.

Se você deseja verificar também se o host é válido, também é necessário verificar o 6código de saída:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Para solucionar o código de erro retornado, basta executar:, curl host:portpor exemplo:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Consulte: man curlpara obter uma lista completa dos códigos de saída.

kenorb
fonte
Infelizmente, isso não funciona para mim (pelo menos no bash no OS X).
Mike Atlas
1
Um serviço personalizado. FWIW, ele meio que funciona: curl $IP:$PORTyields: curl: (52) Empty reply from server(versus curl: (7) Failed to connect), mas muito parecido nc, não posso | grep Emptypor essas declarações de saída como se poderia esperar (algo sobre novas linhas ou falta de saída imediata?). Presumo que sua linha seja condicional com base no código de saída, certo? Eu estou no El Cap; talvez em outras versões ou sistemas operacionais, o estado de falha seja encerrado em -1vez de 52?
Mike Atlas
Sim, isso faria isso. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas
A pergunta era sobre o Windows, que obviamente não possui, por exemplo, / dev / null
Arthur Tacca
@ArthurTacca Você sempre pode usar o Windows Subsystem para Linux (WSL).
kenorb
23

Pressione Windows+ Rdigite cmdeEnter

No prompt de comando, digite

telnet "machine name/ip" "port number"

Se a porta não estiver aberta, esta mensagem será exibida:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

Caso contrário, você será levado para a porta aberta (a tela vazia será exibida)

Leo
fonte
7
Observe que o telnet não é instalado por padrão em sistemas Windows modernos. Você precisará instalá-lo no painel de controle Adicionar / remover recursos do Windows.
Greg
1
@ Greg ou usando uma ferramenta online, tais telnet-online.net
oz
2
@oz verdade, a menos que você está verificando o status de um servidor interno
Greg
funciona em Windows 10
gaurav
19

Use o comando nc,

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

Você também pode usar o comando telnet

telnet <ip/host> port
minhas23
fonte
4

nc ou 'netcat' também possui um modo de varredura que pode ser útil.

caskey
fonte
3
No Mac "nc -zv server port-range"
Vijay Kumar
2

Eu acho que você está procurando pelo Hping ( http://www.hping.org/ ), que tem uma versão do Windows.

"A interface é inspirada no comando ping (8) unix, mas o hping não é capaz de enviar solicitações de eco ICMP. Ele suporta TCP, UDP, ICMP ..."

Também é muito útil se você quiser ver onde, ao longo de uma rota, uma porta TCP está sendo bloqueada (como um firewall), onde o ICMP pode não estar.

Sangue verdadeiro
fonte
2

No Bash, você pode usar arquivos de pseudo-dispositivo que podem abrir uma conexão TCP no soquete associado. A sintaxe é /dev/$tcp_udp/$host_ip/$port.

Aqui está um exemplo simples para testar se o Memcached está em execução:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

Aqui está outro teste para verificar se um site específico está acessível:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Para obter mais informações, consulte: Guia Avançado de Bash-Scripting: Capítulo 29. /deve/proc .

Relacionado: Teste se uma porta em um sistema remoto está acessível (sem telnet) no SuperUser.

Para mais exemplos, consulte: Como abrir um soquete TCP / UDP em um shell bash (artigo).

kenorb
fonte
1
Uau, isso é genial! Não sei se isso é possível apenas com o bash. Tão conveniente para pessoas como eu, que só têm o git bash instalado no Windows e não querem instalar outro serviço.
dotslashlu