À partir d'un script bash, comment savoir rapidement 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 quelques secondes)
2. netstat -an |grep 445 |grep LISTEN
(prend des secondes)
3. telnet
(il ne revient pas)
4. nmap
, netcat
ne sont pas disponibles sur le serveur
Ce sera bien de connaître un moyen qui ne fait pas d'énumération en premier et qui fait ensuite la greps.
netstat -lnt
(avec-t
et sans-a
) limitera la sortie à l'écoute des connexions TCP uniquement. Cela peut accélérer un peu. Vous pouvez ajouter-4
pour IPv4 uniquement si vous n'avez pas besoin d'IPv6.netstat -an | grep PORTNUMBER | grep -i listen
Si la sortie est vide, le port n'est pas utilisé.lsof
est lent pour vous, mais normalement c'est la meilleure des solutions que vous avez énumérées. Votrenetstat
solution n'est pas très fiable (vous pouvez la deviner à chaque fois que vous l'utilisezgrep
; de toute façon elle revient vraie si quelqu'un écoute par exemple sur 4450).telnet
etnetcat
essayez de créer une connexion, ce qui n'est pas toujours ce que vous voulez.Réponses:
Une surprise que j'ai découverte récemment est que Bash supporte nativement les connexions TCP comme descripteurs de fichiers . Utiliser:
J'utilise 6 comme descripteur de fichier parce que 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 devraient être sûrs.
Selon le commentaire ci-dessous, pour tester l'écoute sur un serveur local dans un script:
Pour déterminer si quelqu'un écoute, essayez de vous connecter par bouclage. S'il échoue, le port est fermé ou nous ne sommes pas autorisés à y accéder. Ensuite, fermez la connexion.
Modifiez cela pour votre cas d'utilisation, comme l'envoi d'un e-mail, la fermeture du script en cas d'échec ou le démarrage du service requis.
la source
/dev/tcp/IP/PORT
arbreIl y a une très courte réponse rapide ici: comment tester si le port TCP distant est ouvert à partir du script Shell?
Je l'utilise avec 127.0.0.1 comme adresse "distante".
cela renvoie "0" si le port est ouvert et "1" si le port est fermé
par exemple
la source
Vous pouvez utiliser netstat de cette façon pour des résultats beaucoup plus rapides:
Sous Linux:
Sur Mac:
Cela produira une liste de processus écoutant sur le port (445 dans cet exemple) ou ne produira rien si le port est libre.
la source
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
awk '$6 == "LISTEN" && $4 ~ "80$"'
. Au lieu de vérifier le point avant le numéro de port avec\.80
, j'ai utilisé80$
. Sinon, cela correspond également aux adresses IP contenant.80
et aux ports commençant par80
tels que8000
.Vous pouvez utiliser netcat pour cela.
se connecte au serveur et ferme directement à nouveau la connexion. Si netcat n'est pas en mesure de se connecter, il renvoie un code de sortie différent de zéro. Le code de sortie est stocké dans la variable $ ?. Par exemple,
renverra 0 si et seulement si netcat a réussi à se connecter au port.
la source
nc
a le-z
drapeau à cet effet, qui ne nécessite pas de prendre des entrées/dev/null
. Il y a déjà une réponse en utilisant le-z
drapeau ci-dessus.Basé sur la réponse de Spencer Rathbun, en utilisant bash:
la source
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
ils sont répertoriés dans / proc / net / tcp.
c'est la deuxième colonne, après le ":", en hex:
donc je suppose que l'un de ceux
:50
de la troisième colonne doit être stackoverflow: o)regardez
man 5 proc
pour plus de détails. et choisir cela avec sed, etc. est laissé comme un exercice pour le lecteur doux ...la source
2 ms est assez rapide?
Ajoutez les deux points et cela fonctionne sur Linux
la source
ss
est même légèrement plus rapide quenc
.l
est pour l' écoute ,4
est pour IPv4;sport
signifie (bien sûr) port source . La commande ci-dessus suppose un port TCP d'écoute (t
option): utilisez l'u
option pour les UDP, ou aucun d'entre eux pour les deux protocoles. Plus d'informations surss
comme toujours sur Nixcraft . REMARQUE: lesss
filtres ne fonctionnent pas ici, je ne sais pas pourquoi (bash 4.3.11, utilitaire ss, iproute2-ss131122), doivent aller avec grep .ss
commande ne retourne pas de code de sortie reflétant sa découverte; il retourne toujours 0 code de sortie.| grep LISTEN
?State Recv-Q Send-Q Local Address:Port Peer Address:Port
et maintenant? Qu'est-ce que ça veut dire?En voici une qui fonctionne pour Mac et Linux:
la source
[\\.\:]
.Où 8000 est le numéro de port. Si le port est libre, il démarrera un serveur que vous pourrez fermer facilement. Si ce n'est pas le cas, cela générera une erreur:
la source
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 avec telnet de ma machine de développement au serveur de test. Sur votre machine de développement, essayez d'exécuter:
Dans cet exemple, je veux vérifier si le port 8080 est ouvert sur l'hôte test2.host.com
la source
tcping est un excellent outil avec une surcharge très faible, ainsi qu'un argument de timeout pour le rendre plus rapide:
la source
Vous pouvez également utiliser la commande netcat
ou
-z - définit nc pour simplement rechercher les démons à l'écoute, sans leur envoyer de données.
-v - active le mode détaillé.
la source
nmap
est le bon outil. Utilisez simplementnmap example.com -p 80
Vous pouvez l'utiliser à partir d'un serveur local ou distant. Il vous aide également à identifier si un pare-feu bloque l'accès.
la source
Si vous utilisez iptables, essayez:
ou
la source