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 -
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.
--
“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
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
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
-
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 -
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 }'-
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. -
je regarde le
man
denetstat
, et je me dis qu'un filtre externe n'est peut-être pas nécessaire.
sur Arch, je n'ai pasnetstat
, l'équivalent estss
.
adapté facilement des exemples duman
:ss --no-header --numeric --options state established dport = :ssh | awk '{split($NF,a,":"); print a[1]}'
peut-on se passer deawk
? ... -
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 Pastebincurl --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 -
-
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 b5dans 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é…
-
-
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.
-
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.