IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Test shell pour savoir si un port est ouvert


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 16
    Points
    16
    Par défaut Test shell pour savoir si un port est ouvert
    Bonjour,

    Je bloque sur un simple script shell que je n'arrive pas à résoudre... Il s'agit de réaliser un script qui ouvre le port 80 et qui teste s'il est bien ouvert. Si le port 80 est ouvert, il lance apache2. Si le port 80 est fermé, apache2 est fermé aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    REGLE=`iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT`
    PORT=80
    $REGLE
    netstat -laputen | grep $PORT
    if [ $? -ne 0] ; then
    /etc/init.d/apache2 start
    else 
    return 1

  2. #2
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    J'ai légèrement modifié mon script mais il ne marche toujours pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    `iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT`
    PORT=80
    `nc -z -v -w5 localhost $PORT`
    resultat=$?
     
    if [ "$resultat" != 0] ; then
    echo 'port 80 ferme'
    return 1
    else 
    echo 'port 80 ouvert'
    `/etc/init.d/apache2 start`
    fi

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    une tournure du genre fonctionnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nc -z -v -w5 $HOST $PORT &>/dev/null
    if [[ $? -eq 0 ]]; then
       echo "ouvert"
    else
       echo "fermé"
    fi
    par contre si tu testes sur localhost ton résultat peut être faux, en général tout passe sur l'interface de loopback, c'est sur ton IP de sortie qu'il faut tester.

  4. #4
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    On peut aussi le faire avec lsof

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    if [[ $( lsof -i:80 )  ]] 
     then echo fonctionne
     else echo fonctionne pas
    fi

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par becket Voir le message
    On peut aussi le faire avec lsof
    lsof va te dire si le port est en écoute mais pas si le firewall laisse passer le trafic

    Edit: en fait, ta remarque me fait réaliser que ma méthode n'est pas valide non plus
    • si nc tombe en timeout, on est sûr que le port est bloqué par le firewall
    • si nc répond que le port est ouvert, on est sûr à la fois que le trafic est autorisé par le firewall et également que le serveur web tourne déjà, sauf que ça n'est pas le cas ici, le PO indique qu'il lance le serveur après avoir testé le firewall


    en revanche si nc répond que le port est fermé, comme on ne sait rien de l'état préalable du firewall, on est sûr de rien
    • si le firewall a une policy DROP par défaut, alors un port fermé indiquera que le trafic passe et que la règle de firewall est effective
    • mais si le firewall a une policy REJECT, un port fermé ne permettra pas de savoir si la règle de firewall est effective


    au choix :
    • soit on sait qu'on a une policy DROP par défaut sur le port, et auquel cas on peut éventuellement tester comme suit :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      if [[ $(nc -z -v -w5 $HOST $PORT 2>&1 | grep -Po "Connection \K.+") == "timed out" ]]
      then
         echo "la regle de firewall n'a pas été prise en compte"
      else
         echo "ok, le firewall laisse passer le traffic"
      fi
    • soit -et ça me semblerait plus cohérent- on lance le serveur web avant, et on teste que le trafic passe à travers le firewall ensuite, auquel cas la méthode que j'avais donné plus haut devient valide

Discussions similaires

  1. [AC-2003] Test pour savoir si une référence est active
    Par jmde dans le forum VBA Access
    Réponses: 10
    Dernier message: 19/05/2013, 21h58
  2. Réponses: 2
    Dernier message: 11/06/2010, 15h45
  3. Savoir si un port est ouvert sur sa machine
    Par Matthieu Brucher dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 29/07/2009, 20h31
  4. Réponses: 17
    Dernier message: 14/02/2006, 00h21
  5. Fonction pour savoir si un ordi est connecté au reseau
    Par LitteulKevin dans le forum Windows
    Réponses: 17
    Dernier message: 13/09/2004, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo