Como criar um ouvinte TCP?

40

Introdução: Criei uma função bash que é capaz de verificar se uma porta está disponível e a incrementa em 1 se for falso até um determinado número máximo de portas. Por exemplo, se a porta 500 estiver indisponível, a disponibilidade de 501 será verificada até 550.

Objetivo: Para testar esta função bash, preciso criar um intervalo de portas que estão no estado LISTEN.

Tentativas: No Windows, é possível criar uma porta LISTEN usando estes comandos do PowerShell :

PS C:\Users\u> netstat -nat | grep 1234
PS C:\Users\u> $listener = [System.Net.Sockets.TcpListener]1234
PS C:\Users\u> $listener.Start();
PS C:\Users\u> netstat -nat | grep 1234
TCP    0.0.0.0:1234           0.0.0.0:0              LISTENING       InHost
PS C:\Users\u> $listener.Stop();
PS C:\Users\u> netstat -nat | grep 1234
PS C:\Users\u>

Com base nisso, eu estava tentando pensar em um comando que pudesse fazer o mesmo no CentOS, mas não sei por que e comecei a pesquisar no Google sem encontrar uma solução que resolvesse esse problema.

Resposta esperada : vou aceitar e aprovar a resposta que contém um comando capaz de criar uma porta LISTEN e, uma vez executado o comando, a porta deve permanecer no estado LISTEN, ou seja:

[user@host ~]$ ss -nat | grep 500
LISTEN     0      128                       *:500                       *:*
030
fonte
Em uma nota lateral: é possível encontrar as portas de escuta sem passar por toda essa dança. No Linux: netstat -an --tcp | awk '/LISTEN/ {sub(".*:", "", $4); print $4}' | sort -nu. On * BSD: netstat -an -f inet -p tcp | awk '/LISTEN/ {sub(".*\\.", "", $4); print $4}' | sort -nu.
Lcd047

Respostas:

40

Você pode usar nc -lcomo método para fazer o que está procurando. Algumas implementações de ncpossuem uma -Lopção que permite que as conexões persistam.

Se você precisar apenas deles por um tempo, poderá abrir esse comando em um forloop e ter várias portas abertas dessa maneira.

Se você precisar deles abertos por mais tempo, poderá usar um dos super servidores para criar um daemon.

Dana Marble
fonte
11
Em vez de -Lsugerir : -k, --keep-openaceite várias conexões no modo de escuta
Manuel Durando
37

você pode criar um ouvinte de porta usando o Netcat.

root@ubuntu:~# nc -l 5000

você também pode verificar se a porta está aberta ou não usando o comando netstat.

root@vm-ubuntu:~# netstat -tulpen | grep nc
tcp        0      0 0.0.0.0:5000             0.0.0.0:*               LISTEN      0          710327      17533/nc

você também pode verificar com nc:

Ouvinte do Netcat Server:

nc -l localhost 5000

Cliente Netcat:

root@vm-ubuntu:~# nc -v localhost 5000
Connection to localhost 5000 port [tcp/*] succeeded!

se a porta não estiver aberta

root@vm-ubuntu:~# nc -v localhost 5000
nc: connect to localhost port 5000 (tcp) failed: Connection refused
sameh Ammar
fonte
4
Eu tive que especificar a porta com -pou não funcionou:nc -l -p 1234
Leahkim
nc -l 12345 funcionou no ubuntu 16.04
yuen shi 08/10
Para aqueles com /bin/nc --> nc.traditional(por exemplo, debian), use a -popção, como @Leahkim aconselhou, acima.
ankostis
6

Ouça usando o netcat.

# nc -l 5555

Verifique usando ss

# ss -nat|grep 5555
LISTEN     0      1                         *:5555                     *:*
#
Steve
fonte
0

Note que o netcatpacote Debian tem uma implementação diferente onde (pelo menos) você precisa fornecer a porta através da -popção e a -kopção não funciona. Você pode enfrentar esse problema usando o Docker.

sudo apt install -y netcat

nc -l -p 1337

Você pode usar o openbsd-netcatlugar onde a -kopção funciona.

thisismydesign
fonte
0

Abaixo, o código python é útil para abrir uma porta fictícia

'' 'Servidor de soquete simples usando threads' '' import socket import sys HOST = '' # Nome simbólico, significando todas as interfaces disponíveis PORT = 5500 # Porta arbitrária não privilegiada s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print 'Soquete criado'

Ligar o soquete ao host e porta local

try: s.bind ((HOST, PORT)), exceto socket.error como msg: print 'Falha na ligação. Código de erro: '+ str (msg [0]) +' Message '+ msg [1] sys.exit () print' Socket bind complete '

Comece a ouvir no soquete

s.listen (10) print 'Soquete agora escutando'

agora continue falando com o cliente

Enquanto 1: # espera para aceitar uma conexão - bloqueando a conexão conn, addr = s.accept () imprime 'Conectado com' + addr [0] + ':' + str (addr [1]) s.close ()

Salve o arquivo e execute-o com o comando python, como mostrado abaixo

~] # python portlistener.py Socket criado Socket bind completo Socket agora escutando

Então você pode verificar na máquina necessária.

Rohit
fonte