Bon mot
J'ai mis au point une ligne simple qui répond rapidement à cet objectif, permettant de saisir un nombre arbitraire de ports dans une plage quelconque (ici, il est divisé en 4 lignes pour la lisibilité):
comm -23 \
<(seq "$FROM" "$TO" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
Ligne par ligne
commest un utilitaire qui compare les lignes de deux fichiers devant apparaître triés par ordre alphabétique. Il génère trois colonnes: les lignes qui apparaissent uniquement dans le premier fichier, les lignes qui apparaissent uniquement dans le second et les lignes communes. En spécifiant, -23nous supprimons ces dernières colonnes et ne conservons que la première. Nous pouvons utiliser ceci pour obtenir la différence de deux ensembles, exprimés sous la forme d'une séquence de lignes de texte. J'ai appris à propos de comm ici .
Le premier fichier est la gamme de ports que nous pouvons sélectionner. seqproduit une séquence triée de nombres allant de $FROMà $TO. Le résultat est trié par ordre alphabétique (au lieu de numérique) et dirigé vers commle premier fichier en utilisant la substitution de processus .
Le deuxième fichier est la liste triée des ports, obtenue en appelant la sscommande (ce qui -tsignifie ports TCP, -asignifiant tout établi et à l'écoute - et -nnumérique - n'essayez pas de résoudre, par exemple, 22en ssh). Nous sélectionnons ensuite uniquement la quatrième colonne awkcontenant l’adresse locale et le port. Nous avons l'habitude cutde scinder l'adresse et le port avec le :délimiteur et de ne garder que celui-ci ( -f2). ssgénère également un en-tête, que nous éliminons par grepping pour les séquences non vides de nombres ne dépassant pas 5. Nous nous conformons ensuite à comml'exigence de s sorten dupliquant -u.
Maintenant , nous avons une liste triée des ports ouverts, que nous pouvons shufFLE pour saisir ensuite les premiers "$HOWMANY"ceux avec head -n.
Exemple
Saisissez les trois ports ouverts aléatoires dans la plage privée (49152-65535)
comm -23 <(seq 49152 65535 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | shuf | head -n 3
pourrait revenir par exemple
54930
57937
51399
Remarques
- passer
-tavec -udans sspour obtenir des ports UDP libres à la place.
- remplacez
shufpar sort -nsi vous préférez avoir les ports disponibles triés numériquement plutôt que de façon aléatoire
-nà netstat et un grep plus sélectif). Pour ce faire, essayez d'ouvrir un port dans le mode dont vous avez besoin et essayez-en un autre s'il n'est pas disponible.