Tester efficacement si un port est ouvert sur Linux (sans nmap ou netcat)

à partir d'un script bash Comment puis-je rapidement savoir si un port 445 est ouvert/à l'écoute sur un serveur.

j'ai essayé quelques options, mais je veux quelque chose de rapide:

1. lsof -i :445 (prend des secondes)

2. netstat -an |grep 445 |grep LISTEN (prend des secondes)

3. telnet (il n'a pas de retour)

4. nmap , netcat ne sont pas disponibles sur le serveur

il sera agréable de connaître une façon qui n'énumère pas d'abord et greps après cela.

176
demandé sur Aurélien Ooms 2012-03-08 01:12:04

13 réponses

une surprise que j'ai découvert récemment est que Bash supporte les connexions tcp en tant que descripteurs de fichier . A 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 devrait être sans danger.

comme dans 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 par boucle. S'il échoue, alors le port est fermé ou nous ne sommes pas autorisés à y accéder. Après, fermez la connexion.

Modifiez ceci pour votre cas d'utilisation, tel que l'envoi d'un e-mail, la sortie du script en cas d'échec, ou le démarrage du service requis.

143
répondu Spencer Rathbun 2012-03-08 18:47:44

il y a un très court-métrage avec "réponse rapide" ici: comment tester si le port TCP distant est ouvert à partir du script Shell?

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

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

96
répondu Yosemite Sam 2017-05-23 10:31:15

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

Sur Linux:

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

Sur Mac:

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

ceci affichera une liste des processus écoutés sur le port (445 dans cet exemple) ou ne affichera rien si le port est libre.

88
répondu anubhava 2017-08-07 20:53:23

Vous pouvez utiliser netcat pour cela.

nc ip port < /dev/null

se connecte au serveur et ferme directement la connexion à nouveau. Si netcat n'est pas en mesure de se connecter, il renvoie un code de sortie non nul. Le code de sortie est stocké dans la variable $?. À titre d'exemple,

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

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

35
répondu Tony 2014-09-11 17:21:00

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

c'est la deuxième colonne, après le ":", dans 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 ceux :50 dans la troisième colonne doit être stackoverflow: o)

regardez dans man 5 proc pour plus de détails. et séparer cela avec sed etc est laissé comme un exercice pour le lecteur doux...

14
répondu andrew cooke 2012-03-07 21:26:13
ss -tl4 '( sport = :22 )'

2ms est assez rapide ?

ajouter le côlon et cela fonctionne sur Linux

10
répondu leucos 2015-09-07 11:53:42

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
7
répondu user1338062 2017-04-12 08:51:36
nc -l 8000

où 8000 est le numéro de port. Si le port est libre, il démarre un serveur que vous pouvez fermer facilement. S'il ne l'est pas, il va jeter une erreur:

nc: Address already in use
5
répondu Jose Enrique 2014-12-17 16:23:28

je voulais vérifier si un port est ouvert sur l'un de nos linux serveurs de test. J'ai pu le faire en essayant de me connecter avec telnet depuis ma machine dev vers le serveur de test. Sur votre machine dev essayer d'exécuter:

$ 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 8080 est ouvert sur l'hôte test2.host.com

5
répondu razvang 2016-10-03 09:01:18

voici un qui fonctionne à la fois pour Mac et Linux:

netstat -aln | awk ' == "LISTEN" &&  ~ "[\.\:]445$"'
4
répondu Artur Bodera 2014-03-11 12:26:23

tcping est un grand outil avec un plafond très bas.Il a également un argument timeout 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
répondu Payam 2018-02-21 23:58:06

nmap est l'outil idéal. Il suffit d'utiliser nmap example.com -p 80

vous pouvez l'utiliser depuis un serveur local ou distant. Il vous aide également à identifier si un pare-feu bloque l'accès.

-1
répondu zainengineer 2016-05-28 09:39:01

si vous utilisez iptables, essayez:

iptables -nL

ou

iptables -nL | grep 445
-3
répondu Noz 2015-11-23 18:43:17