Netstat et variables

Résolu
barnabe0057 Messages postés 17074 Statut Contributeur -  
barnabe0057 Messages postés 17074 Statut Contributeur -
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 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
barnabe0057 Messages postés 17074 Statut Contributeur 4 925
 
Bonjour,

Merci pour ta réponse, je vais étudier cela de plus près.
0
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
barnabe0057 Messages postés 17074 Statut Contributeur 4 925
 
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 227 Statut Membre 13 > barnabe0057 Messages postés 17074 Statut Contributeur
 
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 17074 Statut Contributeur 4 925
 
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 227 Statut Membre 13 > barnabe0057 Messages postés 17074 Statut Contributeur
 
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 38797 Statut Contributeur 6 433 > barnabe0057 Messages postés 17074 Statut Contributeur
 
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 17074 Statut Contributeur 4 925
 
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
barnabe0057 Messages postés 17074 Statut Contributeur 4 925
 
C'est bon j'ai trouvé, j'ai enlevé toutes les double-quotes inutiles dans la commande curl.
0
barnabe0057 Messages postés 17074 Statut Contributeur 4 925
 
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
zipe31 Messages postés 38797 Statut Contributeur 6 433
 
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 17074 Statut Contributeur 4 925 > zipe31 Messages postés 38797 Statut Contributeur
 
Excellent ! Merci pour l'astuce.
0