454 votes

Tester si un port sur un système distant est accessible (sans telnet)

Dans le temps, on utilisait telnet pour voir si un port sur un hôte distant était ouvert : telnet hostname port tente de se connecter à n'importe quel port sur n'importe quel hôte et vous donne accès au flux TCP brut.

Aujourd'hui, les systèmes sur lesquels je travaille n'ont pas de telnet installé (pour des raisons de sécurité), et toutes les connexions sortantes vers tous les hôtes sont bloquées par défaut. Avec le temps, il est facile de ne plus savoir quels ports sont ouverts vers quels hôtes.

Existe-t-il un autre moyen de tester si un port sur un système distant est ouvert - en utilisant un système Linux avec un nombre limité de paquets installés, et telnet n'est pas disponible ?

0 votes

0 votes

J'avais le même problème. La réponse de @Subhranath Chunder ci-dessous m'a aidé. Cependant, j'ai ensuite découvert que pour installer Telnet, il suffisait d'exécuter brew install telnet . Je pense donc que les utilisateurs de Linux peuvent faire de même avec yum y apt-get .

0 votes

Lorsque "toutes les connexions sortantes vers tous les hôtes sont bloquées par défaut", il sera impossible d'effectuer un tel test - vous êtes hors ligne.

15voto

RandomInsano Points 491
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

J'espère que cela résoudra votre problème :)

1 votes

Oui, c'est mieux - la temporisation est presque immédiate pour les ports fermés.

1 votes

Utilise-t-il toujours le protocole TCP ou existe-t-il un moyen de lui faire utiliser le protocole UDP ?

14voto

kenorb Points 22006

Voici une phrase clé :

</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed

en utilisant la syntaxe Bash expliquée dans Réponse de @lornix .

Pour plus d'informations, consultez le site : Guide avancé des scripts Bash : Chapitre 29. /dev y /proc .

1 votes

Quel est le délai d'attente pour les ports fermés ?

0 votes

Est-il possible de supprimer les messages d'erreur ?

10voto

Miguel Ferreira Points 201

En combinant les réponses de @kenorb et @Azukikuru, vous pouvez tester le port ouvert/fermé/firewalled.

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

Une autre approche avec curl pour atteindre n'importe quel port

curl telnet://127.0.0.1:22

9voto

Azukikuru Points 91

J'ai lutté pendant toute une journée parce qu'aucune de ces réponses ne semblait fonctionner pour moi. Le problème est que la version la plus récente de nc n'a plus le -z alors que l'accès direct via TCP (selon @lornix et @slm) échoue lorsque l'hôte n'est pas joignable. J'ai finalement trouvé cette page où j'ai finalement trouvé non pas un mais deux exemples concrets :

  1. nc -w1 127.0.0.1 22 </dev/null

    (le -w s'occupe du délai d'attente, et le drapeau </dev/null remplace le -z drapeau)

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    (le timeout s'occupe du délai d'attente, et le reste est de @slm)

Ensuite, il suffit d'utiliser && y/o || (ou même $? ) pour extraire le résultat. J'espère que quelqu'un trouvera ces informations utiles.

6voto

Robert Boyd Points 61

Voici une fonction qui choisira l'une des méthodes en fonction de ce qui est installé sur votre système :

# Check_port <address> <port> 
check_port() {
if [ "$(which nc)" != "" ]; then 
    tool=nc
elif [ "$(which curl)" != "" ]; then
     tool=curl
elif [ "$(which telnet)" != "" ]; then
     tool=telnet
elif [ -e /dev/tcp ]; then
      if [ "$(which gtimeout)" != "" ]; then  
       tool=gtimeout
      elif [ "$(which timeout)" != "" ]; then  
       tool=timeout
      else
       tool=devtcp
      fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout)  gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout)  timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp)  </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac

}
export check_port

0 votes

Pourquoi définir l'outil, pour l'utiliser plus tard dans l'instruction case. n'est-il pas plus simple de vérifier quel outil est disponible et de l'utiliser immédiatement dans le bloc if ?

0 votes

Bon point - j'ai fait cela à la hâte - il est logique de réduire le code comme vous l'avez suggéré. D'un autre côté, l'outil de paramétrage pourrait être utile s'il y a un besoin d'en faire plus dans une autre partie du code.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X