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
comm
est 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, -23
nous 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. seq
produit 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 comm
le premier fichier en utilisant la substitution de processus .
Le deuxième fichier est la liste triée des ports, obtenue en appelant la ss
commande (ce qui -t
signifie ports TCP, -a
signifiant tout établi et à l'écoute - et -n
numérique - n'essayez pas de résoudre, par exemple, 22
en ssh
). Nous sélectionnons ensuite uniquement la quatrième colonne awk
contenant l’adresse locale et le port. Nous avons l'habitude cut
de scinder l'adresse et le port avec le :
délimiteur et de ne garder que celui-ci ( -f2
). ss
génère également un en-tête, que nous éliminons par grep
ping pour les séquences non vides de nombres ne dépassant pas 5. Nous nous conformons ensuite à comm
l'exigence de s sort
en dupliquant -u
.
Maintenant , nous avons une liste triée des ports ouverts, que nous pouvons shuf
FLE 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
-t
avec -u
dans ss
pour obtenir des ports UDP libres à la place.
- remplacez
shuf
par sort -n
si 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.