Netstat et variables

Résolu/Fermé
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 - 13 mai 2019 à 20:37
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 - 18 mai 2019 à 17:06
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

4 réponses

trauqnej Messages postés 154 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 5 septembre 2022 23
14 mai 2019 à 00:44
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
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
14 mai 2019 à 20:17
Bonjour,

Merci pour ta réponse, je vais étudier cela de plus près.
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 14
14 mai 2019 à 03:34
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
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
14 mai 2019 à 20:16
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 14 > barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022
15 mai 2019 à 13:42
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
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
Modifié le 15 mai 2019 à 22:21
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 14 > barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022
Modifié le 16 mai 2019 à 06:07
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
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 568 > barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022
17 mai 2019 à 10:37
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
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
Modifié le 18 mai 2019 à 12:47
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.”
0
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
18 mai 2019 à 12:57
C'est bon j'ai trouvé, j'ai enlevé toutes les double-quotes inutiles dans la commande curl.
0
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847
Modifié le 18 mai 2019 à 15:23
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.”
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 568
18 mai 2019 à 17:05
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
barnabe0057 Messages postés 14112 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 29 novembre 2022 4 847 > zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
18 mai 2019 à 17:06
Excellent ! Merci pour l'astuce.
0