Antigamente, costumávamos telnet
ver se uma porta em um host remoto estava aberta: telnet hostname port
tentaria conectar-se a qualquer porta em qualquer host e fornecer acesso ao fluxo TCP bruto.
Atualmente, os sistemas nos quais trabalho não têm o telnet instalado (por razões de segurança) e todas as conexões de saída com todos os hosts são bloqueadas por padrão. Com o tempo, é fácil perder o controle de quais portas estão abertas para quais hosts.
Existe outra maneira de testar se uma porta em um sistema remoto está aberta - usando um sistema Linux com um número limitado de pacotes instalados e telnet
não está disponível?
linux
networking
port
Steve HHH
fonte
fonte
brew install telnet
. Então, espero que os usuários do Linux possam fazer o mesmo comyum
eapt-get
.Respostas:
O Bash conseguiu acessar as portas TCP e UDP por um tempo. Na página do manual:
Então você pode usar algo como isto:
Taa Daa!
fonte
cat < /dev/tcp/localhost/22
, você deve obter seu cabeçalho sshd. Evidentemente, seu processo na porta 18080 aguarda a entrada de algo antes de enviar qualquer coisa. A porta 22 ( ssh ) recebe você com sua versão e outros enfeites. Experimente!Bom e detalhado! Nas páginas do manual.
Porta única:
Várias portas:
Gama de portas:
fonte
nc -zv 127.0.0.1 22,80,8080,20-30,443-446
(versão nc: 1.107-4).O Netcat é uma ferramenta útil:
nc 127.0.0.1 123 &> /dev/null; echo $?
Produzirá
0
se a porta 123 estiver aberta e1
se estiver fechada.fonte
telnet
também retiramnc
(embora - estranhamente - nãocurl
ouwget
).FOR
comecem as declarações!-G 2
seria mais apropriado para o tempo limite de TCPO método mais simples, sem fazer uso de outra ferramenta, como
socat
, é o descrito na resposta do @ lornix acima. Isso é apenas para adicionar um exemplo real de como alguém usaria o dispositivo psuedo/dev/tcp/...
no Bash se você quisesse, por exemplo, testar se outro servidor tinha uma determinada porta acessível através da linha de comando.Exemplos
Digamos que eu tenha um host na minha rede chamado
skinner
.O motivo pelo qual você deseja agrupar os
echo > /dev/...
parênteses dessa maneira(echo > /dev/...)
é porque, se não o fizer, com testes de conexões inativos, você verá esses tipos de mensagens.Eles não podem simplesmente ser redirecionados,
/dev/null
pois vêm da tentativa de gravar dados no dispositivo/dev/tcp
. Então, capturamos toda essa saída dentro de um subcomando, ou seja,(...cmds...)
redirecionamos a saída do subcomando.fonte
Descobri que
curl
o trabalho pode ser feito de maneira semelhantetelnet
ecurl
até lhe dirá qual protocolo o ouvinte espera.Construa um URI HTTP a partir do nome do host e da porta como o primeiro argumento para
curl
. Securl
puder se conectar, ele reportará uma incompatibilidade de protocolo e sairá (se o ouvinte não for um serviço da web). Securl
não conseguir se conectar, o tempo limite será excedido.Por exemplo, a porta 5672 no host 10.0.0.99 está fechada ou bloqueada por um firewall:
No entanto, a partir de um sistema diferente, a porta 5672 no host 10.0.0.99 pode ser alcançada e parece estar executando um ouvinte AMQP.
É importante distinguir entre as diferentes mensagens: a primeira falha ocorreu porque
curl
não foi possível conectar à porta. A segunda falha é um teste de sucesso, embora sejacurl
esperado um ouvinte HTTP em vez de um ouvinte AMQP.fonte
wget -qS -O- http://ip.add.re.ss:port
efetivamente deve fazer a mesma coisa.curl myhost:22
.Espero que resolva o seu problema :)
fonte
Aqui está uma frase:
usando a sintaxe Bash explicada na resposta @lornix .
Para obter mais informações, consulte: Advanced Bash-Scripting Guide: Chapter 29.
/dev
and/proc
.fonte
Eu estava lutando por um dia inteiro porque nenhuma dessas respostas parecia funcionar para mim. O problema é que a versão mais recente do
nc
não possui mais o-z
sinalizador, enquanto o acesso direto via TCP (conforme @lornix e @slm) falha quando o host não está acessível. Acabei encontrando esta página , onde finalmente encontrei não um, mas dois exemplos de trabalho:nc -w1 127.0.0.1 22 </dev/null
(a
-w
bandeira cuida do tempo limite e a</dev/null
substitui-z
)timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'
(o
timeout
comando cuida do tempo limite e o restante é de @slm)Em seguida, basta usar
&&
e / ou||
(ou até$?
) para extrair o resultado. Felizmente, alguém encontrará essa informação útil.fonte
Combinando as respostas de @kenorb e @Azukikuru, você pode testar a porta aberta / fechada / com firewall.
Outra abordagem com curl para alcançar qualquer porta
fonte
Aqui está uma função que escolherá um dos métodos, dependendo do que estiver instalado no seu sistema:
fonte
Não deve estar disponível na sua caixa, mas tente com
nmap
.fonte
nmap
é uma boa ferramenta, mas não está disponível nesses sistemas. Em vez de fazer o downloadnmap
, compilá-lo, instalá-lo no meu diretório pessoal e copiá-lo para todos os outros sistemas, eu esperava encontrar uma maneira de usar as ferramentas existentes disponíveis na maioria das instalações do Linux.para referência, expandindo a resposta @peperunas ':
A maneira de usar o nmap para testar é:
(o exemplo acima usa localhost para fins de demonstração)
fonte
Se você precisar testar mais do que no sistema, poderá usar nossa ferramenta de teste dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) para essas tarefas. Você pode definir sua expectativa
e teste essas expectativas no host local ou nos hosts remotos (conecte pelo ssh). Para testes remotos, você deve definir um destino:
Você pode executar o teste com
java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
Sob o capô, estamos usando o netcat como proprosed acima ...
fonte