Netstat et variables [Résolu]

A voir également:Netstat et variablesNetstat - Articles Variable environnement windows - Articles Php variable globale ✓ - Forum - PHP Vba range avec variable ✓ - Forum - VB / VBA Variable c++ - Articles

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

Forum

A voir également:Netstat et variablesNetstat - Articles Variable environnement windows - Articles Php variable globale ✓ - Forum - PHP Vba range avec variable ✓ - Forum - VB / VBA Variable c++ - Articles

Web: www.shapebootstrap.net

4 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    Bonjour,

    Merci pour ta réponse, je vais étudier cela de plus près.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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 }'

Reply
réponses:
  • auteur

  • auteur

    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.

  • auteur

    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
    ? ...

  • auteur

    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

  • auteur

    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 ?

  • auteur

    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é…

  • auteur

    Merci beaucoup zipe31.

    Je commence l'écriture du script et je me heurte au premier problème, faire une boucle qui fonctionne.

    Voilà mon script :

    #! /bin/sh  pastebin=--max-time 30 --tlsv1.2 -s -d "api_dev_key=ef2fbf05c23084e16a3exxxxxxxxxxxx" -d "api_user_key=0a9cde34c5664632dc8cxxxxxxxxxxxx"  # boucle sur tous mes pastebin 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 

    J'ai mis quelques options de curl dans une variable $pastebin car je m'en reservirai plus loin dans le script mais on dirait que ça pose problème, sans compter une autre erreur dans mon for que je n'arrive pas à trouver.

  • auteur

    #! /bin/sh
    C'est quel shell qui est utilisé ? (
    readlink -f /bin/sh
    )

    Avec des quotes autour de la variable ce serait mieux :
    pastebin='--max-time 30 --tlsv1.2 -s -d "blabla" -d "blabla"'


    Idem sans oublier les accolades ;-(

    for key in $( curl "${pastebin}" …

  • auteur

    readlink -f /bin/sh me répond /bin/dash

    J'ai enlevé les double quotes comme ceci : for key in $( curl ${pastebin} …
    Sinon j'avais une erreur, je pense que ça faisait double-emploi avec les quotes de $pastebin

    Je n'ai plus d'erreur, seulement mon echo ne m'affiche rien, donc je ne suis pas en mesure de contrôler si tout se passe bien.

  • auteur

    Donc quelque peu différent du shell bash.
    Je ne bosse pas avec dash, donc il se peut que dans mes exemples, certaines syntaxes ne soient pas comprises par dash…

  • auteur

    Rien ne m'oblige à passer par dash, je vais modifier le shebang pour bash.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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.


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

Reply
réponses:
  • auteur

    C'est bon j'ai trouvé, j'ai enlevé toutes les double-quotes inutiles dans la commande curl.

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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.


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

Reply
réponses:
  • auteur

    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

    ;-)

  • auteur

    Excellent ! Merci pour l'astuce.

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed