web-dev-qa-db-fra.com

Vérifier efficacement si un port est ouvert sous Linux?

À partir d'un script bash, comment savoir rapidement si un port 445 est ouvert/en écoute sur un serveur.

J'ai essayé plusieurs options, mais je veux quelque chose de rapide:
1. lsof -i :445 (Prend quelques secondes)
2. netstat -an |grep 445 |grep LISTEN (Prend quelques secondes)
3. telnet (il ne retourne pas)
4. nmap, netcat ne sont pas disponibles sur le serveur

Il serait bon de connaître un moyen de ne pas énumérer d’abord et ensuite de créer des greps.

189
Aman Jain

Une surprise que j'ai découverte récemment est que Bash supporte nativement connexions TCP en tant que descripteurs de fichier . Utiliser:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

J'utilise 6 comme descripteur de fichier car 0,1,2 sont stdin, stdout et stderr. 5 est parfois utilisé par Bash pour les processus enfants , donc 3,4,6,7,8 et 9 doivent être sûrs.

Selon le commentaire ci-dessous, pour tester l'écoute sur un serveur local dans un script:

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

Pour déterminer si quelqu'un écoute, essayez de vous connecter en boucle. Si cela échoue, le port est fermé ou l'accès n'est pas autorisé. Ensuite, fermez la connexion.

Modifiez ceci pour votre cas d'utilisation, par exemple en envoyant un courrier électronique, en quittant le script en cas d'échec ou en démarrant le service requis.

153
Spencer Rathbun

Il y a une très courte réponse rapide ici: Comment vérifier si le port distant TCP est ouvert à partir d'un script shell?

$ nc -z <Host> <port>; echo $?

Je l'utilise avec 127.0.0.1 comme adresse "distante".

103
user2187128

Vous pouvez utiliser netstat de cette façon pour obtenir des résultats beaucoup plus rapides:

Sous Linux:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

Sur Mac:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

Cela produira une liste de processus en écoute sur le port (445 dans cet exemple) ou ne produira aucune sortie si le port est libre.

89
anubhava

Vous pouvez utiliser netcat pour cela.

nc ip port < /dev/null

se connecte au serveur et ferme directement la connexion à nouveau. Si netcat ne parvient pas à se connecter, il renvoie un code de sortie non nul. Le code de sortie est stocké dans la variable $ ?. Par exemple,

nc ip port < /dev/null; echo $?

retournera 0 si et seulement si netcat peut se connecter avec succès au port.

37
Tony

ils sont listés dans/proc/net/tcp.

c'est la deuxième colonne, après le ":", en hex:

> cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 10863 1 ffff88020c785400 99 0 0 10 -1                     
   1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1                      
   2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000  1000        0 10562454 2 ffff88010040f7c0 22 3 30 5 3                   
   3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000  1000        0 10701021 2 ffff880100474080 41 3 22 10 -1                 
   4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000  1000        0 10700849 2 ffff880104335440 57 3 18 10 -1                 
   5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000  1000        0 10698952 2 ffff88010040e440 46 3 0 10 -1                  
   6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000  1000        0 9562907 2 ffff880104334740 22 3 30 5 4                    
   7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000  1000        0 10696677 2 ffff880106cc77c0 45 3 0 10 -1  

donc je suppose que l'un de ces :50 dans la troisième colonne doit être stackoverflow: o)

regardez dans man 5 proc pour plus de détails. et choisir cela en dehors de sed etc. est laissé comme un exercice pour le lecteur attentif ...

15
andrew cooke

Basé sur la réponse de Spencer Rathbun, en utilisant bash:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed
14
user1338062
ss -tl4 '( sport = :22 )'

2ms est assez rapide?

Ajouter les deux points et cela fonctionne sous Linux

11
leucos

En voici un qui fonctionne pour Mac et Linux:

netstat -aln | awk '$6 == "LISTEN" && $4 ~ "[\\.\:]445$"'
6
Artur Bodera

Je voulais vérifier si un port est ouvert sur l'un de nos serveurs de test Linux. J'ai pu le faire en essayant de me connecter à telnet depuis mon ordinateur dev vers le serveur de test. Sur votre machine dev, essayez de lancer:

$ telnet test2.Host.com 8080
Trying 05.066.137.184...
Connected to test2.Host.com

Dans cet exemple, je veux vérifier si le port 808 est ouvert sur l'hôte test2.Host.com

5
razvang
nc -l 8000

Où 8000 est le numéro de port. Si le port est libre, il va démarrer un serveur que vous pouvez fermer facilement. Si ce n'est pas le cas, une erreur sera générée:

nc: Address already in use
5
Jose Enrique

tcping est un excellent outil avec des frais généraux très faibles. Il dispose également d'un argument de délai d'expiration pour le rendre plus rapide:

[root@centos_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[root@centos_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[root@centos_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.
1
Payam

Vous pouvez aussi utiliser la commande netcat

[location of netcat]/netcat -zv [ip] [port]

ou

nc -zv [ip] [port]

-z - configure nc pour qu'il recherche simplement les démons d'écoute sans leur envoyer de données.
- v - active le mode prolixe.

0
Saurabh