Netstat et variables

Résolu
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. 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
    1. Bonjour,

      Merci pour ta réponse, je vais étudier cela de plus près.
  2. 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 }'
    1. 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.
    2. @barnabe0057je 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
      ? ...
    3. 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
    4. @barnabe00572/ 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 ?
    5. Contributeur
      @barnabe0057Salut,
      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é…
  3. 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.

    1. C'est bon j'ai trouvé, j'ai enlevé toutes les double-quotes inutiles dans la commande curl.
  4. 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.

    1. Contributeur
      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

      ;-)
    2. @zipe31Excellent ! Merci pour l'astuce.