Netstat et variables

Résolu
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -  
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Sur ma Dedibox, je voudrais traiter chaque résultat renvoyé par la commande netstat que voici :



1) Quelle boucle choisir ?
2) Comment récupérer les adresses ip et les ports dans des variables ?

Merci d'avance pour votre aide.

Configuration: Win 7 Pro SP1 64bits
Athlon X4 750K Quad Core
8 Go DDR3 1866 Mhz


--

“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”

4 réponses

  1. trauqnej Messages postés 162 Statut Membre 23
     
    Bonjour,
    Je ferais un truc du genre :
    netstat -nla | grep "ESTABLISHED" | while read a b c d e f ; do IP=$(echo $e |cut -d: -f1 ); PORT=$(echo $e |cut -d: -f2 );echo $PORT-$IP; done


    ---
    Trauqnej
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Bonjour,

      Merci pour ta réponse, je vais étudier cela de plus près.
      0
  2. lEprofSonDkon Messages postés 227 Statut Membre 13
     
    salut,

    il faut être plus précis sur ce que tu veux faire.

    de toute façon, laisse tomber le shell, tous ces pipes prennent beaucoup de temps.
    passe directement à
    awk
    :
    netstat ... | awk '/ESTABLISHED/ && /163\.172\....\..../{ là, tu fais tes trucs avec $3 et $4 }'
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Salut,

      Je vais tenter d'expliquer ce que je veux faire, voilà les grandes lignes : des personnes de mon entourage se connectent via SSH sur mon serveur, je voudrais avoir le statut en temps réel (connecté ou non connecté), pour cela je voudrais créer une sorte de monitoring qui me dira quelle adresse est connectée sur quel port.

      Ensuite pour la partie technique, j'envisage d'utiliser NETSTAT pour détecter les tunnels SSH, puis pour chaque résultat pertinent je vais envoyer une requête (via CURL) pour créer un Pastebin contenant l'adresse et le port concerné.

      Ensuite depuis Windows, un script viendra lire mes Pastebin pour m'indiquer le statut de mes contacts.
      0
    2. lEprofSonDkon Messages postés 227 Statut Membre 13 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      je regarde le
      man
      de
      netstat
      , et je me dis qu'un filtre externe n'est peut-être pas nécessaire.

      sur Arch, je n'ai pas
      netstat
      , l'équivalent est
      ss
      .
      adapté facilement des exemples du
      man
      :
      ss --no-header --numeric --options state established dport = :ssh | awk '{split($NF,a,":"); print a[1]}'


      peut-on se passer de
      awk
      ? ...
      0
    3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Merci pour ton aide, la commande ss me donne des résultats que je ne sais pas interpréter, je vais rester sur netstat.

      Très bien on avance, maintenant je vais expliquer la suite :

      1) mon script récupère la liste de mes pastebin, ça je sais faire grâce à cURL et à l'API Pastebin
      curl --max-time 30 --tlsv1.2 -s -d "api_dev_key=ef2fbf05c23084e16a3e32xxxxxxxxxx" -d "api_user_key=0a9cde34c5664632dc8cbdxxxxxxxxxx" -d "api_option=list" "https://pastebin.com/api/api_post.php"

      <paste>
      <paste_key>ziNKA0Y0</paste_key>
      <paste_date>1557948491</paste_date>
      <paste_title>[IDEAPAD-PC]</paste_title>
      <paste_size>18</paste_size>
      <paste_expire_date>0</paste_expire_date>
      <paste_private>0</paste_private>
      <paste_format_long>None</paste_format_long>
      <paste_format_short>text</paste_format_short>
      <paste_url>https://pastebin.com/ziNKA0Y0</paste_url>
      <paste_hits>56</paste_hits>
      </paste>
      <paste>
      <paste_key>KuJgybEd</paste_key>
      <paste_date>1557396624</paste_date>
      <paste_title>Mon hash</paste_title>
      <paste_size>95</paste_size>
      <paste_expire_date>0</paste_expire_date>
      <paste_private>0</paste_private>
      <paste_format_long>None</paste_format_long>
      <paste_format_short>text</paste_format_short>
      <paste_url>https://pastebin.com/KuJgybEd</paste_url>
      <paste_hits>6</paste_hits>
      </paste>


      2) je récupère le contenu du premier pastebin, le contenu est de la forme $adresseip:$port
      Pour récupérer le contenu, je dois récupérer d'abord la paste_key, as-tu une idée ?

      3) je cherche une occurrence de $adresseip dans les résultats de cette commande :
      netstat -n | awk '/ESTABLISHED/ && /163.172.xxx.xxx:22/ { print $5 }'

      4) je cherche une occurrence de $port dans les résultats de cette commande :
      netstat -n | awk '/ESTABLISHED/ && /127.0.0.1/ { print $5 }'

      5) si les conditions 3 et 4 sont vraies alors cela signifie qu'un de mes contacts est connecté, dans le cas contraire je dois effacer le pastebin en passant par cURL et l'API Pastebin

      J'ai besoin de toi pour les étapes 2, 3, 4, 5
      0
    4. lEprofSonDkon Messages postés 227 Statut Membre 13 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      2/ le XML se traite avec XSLT; sinon un grep et deux cut, ou un awk pas trop velu.
      3,4/ RTFM : comme je l'ai montré, netstat dispose d'options de filtrage
      5/ je ne connais pas l'API pastebin.
      tu ne peux pas récupérer les données en ssh avec scp ?
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Salut,
      Pour récupérer le contenu, je dois récupérer d'abord la paste_key, as-tu une idée ?
      En partant du fichier donné en exemple :
      $ grep -Po '<paste_key>\K[^<]*' pastebin.xml
      ziNKA0Y0
      KuJgybEd

      À partir de là, tu boucles sur chaque ligne de sortie et tu passes ça à cURL (via l'affichage "raw") :
      $ curl "https://pastebin.com/raw/ziNKA0Y0"
      41.108.53.56:21180
      $ curl "https://pastebin.com/raw/KuJgybEd"
      4e d7 7b dd 14 5e e2 81 7b 63 ee 71 75 9d d3 9b db 51 7f 8c 72 1f af e1 d6 60 8b 92 68 5a 7f b5

      dans le cas contraire je dois effacer le pastebin en passant par cURL et l'API Pastebin
      De la même façon que tu as pu récupérer ta liste via l'API, tu as dans la doc de l'API les explications pour supprimer le pastebin désiré…
      0
  3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Toujours pas moyen d'afficher mes paste_key à l'aide de la boucle.

    #! /bin/bash
    
    # je crée une variable contenant mes identifiants pour l'API Pastebin
    pastebin='--max-time 30 --tlsv1.2 -s -d "api_dev_key=ef2fbf05c23084e16a3exxxxxxxxxxxx" -d "api_user_key=0a9cde34c5664632dc8cxxxxxxxxxxxx"'
    
    # je boucle pour récupérer la liste de mes paste_key
    for key in $( curl ${pastebin} -d "api_option=list" "https://pastebin.com/api/api_post.php" | grep -Po '<paste_key>\K[^<]*' )
    
    do
    echo "$key"
    done
    
    sleep 2
    


    Pourtant si je tape la commande curl directement dans le terminal j'obtiens bien la liste voulue.

    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      C'est bon j'ai trouvé, j'ai enlevé toutes les double-quotes inutiles dans la commande curl.
      0
  4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Voilà mon script est terminé, je peux passer le sujet en "résolu" :

    #! /bin/bash
    
    # je définis les paramètres de cURL
    opts='-s --max-time 30 --tlsv1.2'
    
    # je définis l'API à utiliser
    api=https://pastebin.com/api/api_post.php
    
    # je crée une variable contenant mes identifiants pour l'API Pastebin
    pastebin='-d api_dev_key=ef2fbf05c23084e16a3exxxxxxxxxxxx -d api_user_key=0a9cde34c5664632dc8cxxxxxxxxxxxx'
    
    # je boucle pour récupérer la liste de mes paste_key publiques
    for key in $( curl $opts $pastebin -d api_option=list $api | grep -Po '<paste_key>\K[^<]*' | grep -v "AhNgsVqW" | grep -v "KuJgybEd" )
    do
            status=0
    
            # je récupère l'adresse ip et le port
            ip=$(curl $opts "https://pastebin.com/raw/$key" |cut -d: -f1 -s)
            port=$(curl $opts "https://pastebin.com/raw/$key" |cut -d: -f2 -s)
    
            # je temporise au cas où le tunnel ne serait pas totalement établi
            sleep 30
    
            # je compare le pastebin avec les tunnels existants
            netstat -nt4 | grep "163.172.xxx.xxx:22" | grep "$ip" && status=$((status+1))
            netstat -nt4 | grep "127.0.0.1" | grep "$port" && status=$((status+1))
    
            # si le pastebin est obsolète, je le supprime
            if [ $status -lt 2 ]
            then
                    curl $opts $pastebin -d api_paste_key=$key -d api_option=delete $api
            fi
    done


    Merci à tous les trois pour votre aide, je vous souhaite une excellente journée.

    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Merci du retour.

      Sinon pour éviter les "cut" :
      $ ip="41.108.53.56:21180"

      $ echo "${ip}"
      41.108.53.56:21180

      $ echo "${ip%:*}"
      41.108.53.56

      $ echo "${ip#*:}"
      21180

      ;-)
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Excellent ! Merci pour l'astuce.
        0