Bon mot
J'ai mis en place une belle ligne qui répond rapidement au but recherché, 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") \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -n | uniq) \
| shuf | head -n "$HOWMANY"
Ligne par ligne
comm
est un utilitaire qui compare les lignes triées dans deux fichiers. 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 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 dirigé vers comm
le premier fichier 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
affiche é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 en sort
insérant numériquement ( -n
) et en supprimant les doublons uniq
.
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) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort | uniq) | shuf | head -n 3
pourrait revenir par exemple
54930
57937
51399
Remarques
- passer
-t
avec -u
dans ss
pour obtenir les ports UDP libres à la place.
- déposer
shuf
si vous n'êtes pas intéressé par un portage aléatoire