Efficace de tester si un port est ouvert sur Linux?
À partir d'un script bash comment puis-je savoir rapidement si un port 445
est ouvert/à l'écoute sur un serveur.
J'ai essayé un couple d'options, mais je veux quelque chose de rapide:
1. lsof -i :445
(Prend que quelques secondes)
2. netstat -an |grep 445 |grep LISTEN
(Prend que quelques secondes)
3. telnet
(il n'a pas de retour)
4. nmap
, netcat
ne sont pas disponibles sur le serveur
Il sera bon de connaître d'une manière qui n'a pas d'énumérer d'abord et grep après.
- Est-ce que netcat disponible? Il a rapide de l'échec chemin de l'IIRC. netcat.sourceforge.net
netstat -lnt
(avec-t
et sans-a
) limite la sortie à l'écoute des connexions TCP uniquement. Il peut accélérer un peu. Vous pouvez ajouter-4
pour IPv4 uniquement si vous n'avez pas besoin d'IPv6.- lsof -i est un favori personnel.
netstat -an | grep PORTNUMBER | grep -i listen
Si la sortie est vide, le port n'est pas en cours d'utilisation.- Je ne sais pas pourquoi
lsof
est lent pour vous, mais normalement c'est la meilleure des solutions que vous avez énumérés. Votrenetstat
solution n'est pas très fiable (vous pouvez le deviner à chaque fois que vous utilisezgrep
; de toute façon il retourne true si quelqu'un est à l'écoute sur, par exemple, 4450).telnet
etnetcat
réellement tenter de créer une connexion, qui peut ne pas toujours être ce que vous voulez. - essayez en ligne des outils pour le port de détails dans la manière la plus rapide - yougetsignal.com/tools/open-ports
Vous devez vous connecter pour publier un commentaire.
Une surprise, j'ai découvert récemment, c'est que Bash prend nativement en charge les connexions tcp en tant que descripteurs de fichiers. Utilisation:
Je suis en utilisant 6 que le descripteur de fichier car 0,1,2 sont stdin, stdout, et stderr. 5 est parfois utilisé par les Bash pour les processus enfants, donc 3,4,6,7,8, et 9 doivent être sûrs.
Que par le commentaire ci-dessous, à l'essai pour l'écoute sur un serveur local dans un script:
Pour déterminer si quelqu'un est à l'écoute, de tentative de connexion de bouclage. Si elle échoue, alors le port est fermé ou que nous ne sommes pas autorisés à accéder. Ensuite, fermer la connexion.
Modifier cela pour votre cas d'utilisation, telles que l'envoi d'un e-mail, la sortie du script en cas d'échec, ou de démarrer le service requis.
&&
à la première ligne, alors il peut imprimer que le port est active, mais c'est la nature de la commande n'est au courant de qui est le port./dev/tcp/IP/PORT
arbreIl y a un très court, avec des "réponse rapide" ici : Comment tester si éloignées de port TCP est ouvert à partir d'un script Shell?
Je l'utilise avec 127.0.0.1 comme "à distance" de l'adresse.
Vous pouvez utiliser la commande netstat cette façon pour des résultats beaucoup plus rapidement:
Sur Linux:
Sur Mac:
Ceci affichera une liste des processus en écoute sur le port (445 dans cet exemple) ou elle ne renvoie rien si le port est gratuit.
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
32
avec la commande ci-dessus,php -S localhost:32
awk '$6 == "LISTEN" && $4 ~ "80$"'
. Au lieu de vérifier le point avant le numéro de port par\.80
, j'ai utilisé80$
. Sinon, cela correspond aussi les adresses IP contenant.80
et les ports de départ avec80
comme8000
.awk '$6 == "LISTEN" && $4 ~ "\.80$"'
:
). Le Macnetstat
mise en œuvre utilise un.
(dot) pour ajouter le numéro de port (curieusement), mais sur Linux, vous avez besoin de:
, comme vous le dites.Vous pouvez utiliser netcat pour cela.
se connecte au serveur directement et ferme la connexion à nouveau. Si netcat n'est pas en mesure de se connecter, il renvoie un code de sortie non nulle. Le code de sortie est stockée dans la variable $?. Comme un exemple,
sera de retour 0 si et seulement si netcat pourrait réussir à se connecter au port.
nc
a la-z
pavillon à cette fin, qui ne nécessite pas la prise d'entrée de/dev/null
. Il y a déjà une réponse à l'aide de la-z
drapeau ci-dessus.ils sont listés dans /proc/net/tcp.
c'est la deuxième colonne, après le ":", dans hex:
donc je suppose que l'un de ces
:50
dans la troisième colonne doit être stackoverflow :o)regarder dans
man 5 proc
pour plus de détails. et de la cueillette qu'à part avec sed etc est laissé comme exercice pour le lecteur doux...Basé sur Spencer Rathbun, en réponse, à l'aide de bash:
2ms est assez rapide ?
Ajouter le côlon et cela fonctionne sur Linux
ss
est même slighlty plus vite quenc
.l
est pour écouter,4
est pour IPv4;sport
est synonyme de (bien sûr) port source. La commande ci-dessus est en supposant une écoute TCP port (t
option): utilisationu
option pour l'UDPs, ou aucun d'entre eux pour les deux protocoles. Plus d'infos surss
comme toujours sur Nixcraft. REMARQUE:ss
les filtres ne sont pas de travail ici, je ne sais pas pourquoi (bash 4.3.11, ss utilitaire, iproute2-ss131122), ont pour aller avec grep.ss
commande ne permet pas de retourner un code de sortie reflétant ses conclusions; elle renvoie toujours 0 code de sortie.| grep LISTEN
?Voici un qui fonctionne à la fois pour Mac et Linux:
[\\.\:]
.Où 8000 est le numéro de port. Si le port est gratuit, il démarre un serveur que vous pouvez le fermer facilement. Si elle ne l'est pas, il renvoie une erreur:
Je voulais vérifier si un port est ouvert sur l'un de nos linux serveurs de test.
J'ai été en mesure de le faire en essayant de se connecter avec telnet à partir de ma machine de dev pour le serveur de test. Sur vous dev machine essayez d'exécuter:
Dans cet exemple, je veux vérifier si le port 8080 est ouvert sur l'hôte test2.host.com
tcping est un outil formidable avec une très faible hauteur.Il dispose également d'un délai d'attente argument pour la rendre plus rapide:
Vous pouvez utiliser netcat commande ainsi
ou
-z – jeux de nc de numériser tout simplement pour écouter les démons, sans réellement l'envoi des données.
-v active le mode verbeux.
nmap
est le bon outil.Utilisez simplement
nmap example.com -p 80
Vous pouvez l'utiliser de serveur local ou distant.
Il vous aide également à identifier si un pare-feu bloque l'accès.
Si vous utilisez iptables essayer:
ou