Em um script bash, como posso descobrir rapidamente se uma porta 445
está aberta / escutando em um servidor.
Eu tentei algumas opções, mas quero algo rápido:
1. lsof -i :445
(Leva segundos)
2. netstat -an |grep 445 |grep LISTEN
(Leva segundos)
3. telnet
(não retorna)
4. nmap
, netcat
não está disponível no servidor
Será bom saber de uma maneira que não enumere primeiro e depois cumpra.
netstat -lnt
(com-t
e sem-a
) limitará a saída apenas às conexões TCP. Pode acelerar um pouco. Você pode adicionar-4
para o IPv4 apenas se não precisar do IPv6.netstat -an | grep PORTNUMBER | grep -i listen
Se a saída estiver vazia, a porta não está em uso.lsof
é lento para você, mas normalmente é a melhor das soluções que você listou. Suanetstat
solução não é muito confiável (você pode adivinhar sempre que usargrep
; de qualquer maneira, ela retornará verdadeira se alguém estiver ouvindo, por exemplo, 4450).telnet
enetcat
tente criar uma conexão, que nem sempre é o que você deseja.Respostas:
Uma surpresa que descobri recentemente é que o Bash suporta nativamente conexões tcp como descritores de arquivos . Usar:
Estou usando 6 como o descritor de arquivo porque 0,1,2 são stdin, stdout e stderr. Às vezes, 5 é usado pelo Bash para processos filho ; portanto, 3,4,6,7,8 e 9 devem ser seguros.
Conforme o comentário abaixo, para testar a escuta em um servidor local em um script:
Para determinar se alguém está ouvindo, tente conectar-se por loopback. Se falhar, a porta está fechada ou não temos acesso permitido. Depois, feche a conexão.
Modifique isso para seu caso de uso, como enviar um email, sair do script com falha ou iniciar o serviço necessário.
fonte
/dev/tcp/IP/PORT
árvoreHá uma breve resposta "rápida" aqui: Como testar se a porta TCP remota é aberta no script do Shell?
Eu o uso com 127.0.0.1 como endereço "remoto".
isso retorna "0" se a porta estiver aberta e "1" se a porta estiver fechada
por exemplo
fonte
Você pode usar o netstat dessa maneira para obter resultados muito mais rápidos:
No Linux:
No Mac:
Isso produzirá uma lista de processos atendendo na porta (445 neste exemplo) ou não produzirá nada se a porta estiver livre.
fonte
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
awk '$6 == "LISTEN" && $4 ~ "80$"'
. Em vez de procurar o ponto antes do número da porta\.80
, usei80$
. Caso contrário, isso também combinava endereços IP que contêm.80
e portas começando com80
tais como8000
.Você pode usar o netcat para isso.
conecta ao servidor e fecha a conexão diretamente novamente. Se o netcat não conseguir se conectar, ele retornará um código de saída diferente de zero. O código de saída é armazenado na variável $ ?. Como um exemplo,
retornará 0 se e somente se o netcat puder se conectar com êxito à porta.
fonte
nc
tem o-z
sinalizador para esse fim, o que não exige a entrada de/dev/null
. Já existe uma resposta usando a-z
bandeira acima.Com base na resposta de Spencer Rathbun, usando o bash:
fonte
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
eles estão listados em / proc / net / tcp.
é a segunda coluna, após o ":", em hexadecimal:
então eu acho que um daqueles
:50
na terceira coluna deve ser stackoverflow: o)procure
man 5 proc
mais detalhes. e escolher isso além do sed etc é deixado como um exercício para o leitor gentil ...fonte
2ms é rápido o suficiente?
Adicione os dois pontos e isso funciona no Linux
fonte
ss
é ainda mais rápido quenc
.l
é para ouvir ,4
é para IPv4;sport
significa (claro) porta de origem . O comando acima está assumindo uma porta TCP de escuta (t
opção): useu
option para UDPs ou nenhuma delas para os dois protocolos. Mais informações sobress
como sempre no Nixcraft . OBSERVAÇÃO: osss
filtros não estão funcionando aqui, não sei por que (o bash 4.3.11, utilitário ss, iproute2-ss131122), precisa seguir o grep .ss
comando não retorna um código de saída que reflete sua descoberta; sempre retorna 0 código de saída.| grep LISTEN
?State Recv-Q Send-Q Local Address:Port Peer Address:Port
e agora? O que isto significa?Aqui está um que funciona para Mac e Linux:
fonte
[\\.\:]
.Onde 8000 é o número da porta. Se a porta estiver livre, iniciará um servidor que você pode fechar facilmente. Se não for, lançará um erro:
fonte
Eu queria verificar se uma porta está aberta em um dos nossos servidores de teste Linux. Consegui fazer isso tentando me conectar ao telnet da minha máquina de desenvolvimento ao servidor de teste. Na sua máquina dev, tente executar:
Neste exemplo, quero verificar se a porta 8080 está aberta no host test2.host.com
fonte
O tcping é uma ótima ferramenta com uma sobrecarga muito baixa. Também possui um argumento de tempo limite para torná-lo mais rápido:
fonte
Você também pode usar o comando netcat
ou
-z - configura o nc para simplesmente procurar daemons que estão escutando, sem enviar dados para eles.
-v - ativa o modo detalhado.
fonte
nmap
é a ferramenta certa. Basta usarnmap example.com -p 80
Você pode usá-lo no servidor local ou remoto. Também ajuda a identificar se um firewall está bloqueando o acesso.
fonte
Se você estiver usando o iptables, tente:
ou
fonte