90 lines
2.1 KiB
Bash
Executable File
90 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
usage() {
|
||
echo "Użycie: $0 [OPCJE] [MIN_PORT] [MAX_PORT]"
|
||
echo ""
|
||
echo "Opcje:"
|
||
echo " -n Wypisz też 4 sąsiednie porty (±1, ±2) z ich statusem"
|
||
echo " -l Wypisz wszystkie zajęte porty"
|
||
echo " -h Pokaż tę pomoc"
|
||
echo ""
|
||
echo "Przykłady:"
|
||
echo " $0 # zakres 1024–65535"
|
||
echo " $0 3000 9000 # własny zakres"
|
||
echo " $0 -n # z sąsiadami"
|
||
echo " $0 -l # pokaż zajęte porty"
|
||
echo " $0 -n 3000 9000 # z sąsiadami i własnym zakresem"
|
||
exit 0
|
||
}
|
||
|
||
SHOW_NEIGHBORS=false
|
||
SHOW_LIST=false
|
||
while getopts ":nlh" opt; do
|
||
case $opt in
|
||
n) SHOW_NEIGHBORS=true ;;
|
||
l) SHOW_LIST=true ;;
|
||
h) usage ;;
|
||
\?) echo "❌ Nieznana opcja: -$OPTARG" >&2; exit 1 ;;
|
||
esac
|
||
done
|
||
shift $(( OPTIND - 1 ))
|
||
|
||
MIN_PORT=${1:-1024}
|
||
MAX_PORT=${2:-65535}
|
||
|
||
echo "🔍 Szukam zajętych portów w zakresie $MIN_PORT–$MAX_PORT..."
|
||
|
||
USED_PORTS=$(ss -tuln 2>/dev/null \
|
||
| awk 'NR>1 {print $5}' \
|
||
| grep -oE '[0-9]+$' \
|
||
| sort -un)
|
||
|
||
USED_COUNT=$(echo "$USED_PORTS" | grep -c '^[0-9]')
|
||
echo "📋 Znaleziono $USED_COUNT zajętych portów."
|
||
|
||
if $SHOW_LIST; then
|
||
echo ""
|
||
echo "🔴 Zajęte porty:"
|
||
echo "$USED_PORTS" | grep '^[0-9]' | xargs printf " %s\n"
|
||
echo ""
|
||
fi
|
||
|
||
is_used() {
|
||
echo "$USED_PORTS" | grep -qx "$1"
|
||
}
|
||
|
||
MAX_ATTEMPTS=1000
|
||
ATTEMPT=0
|
||
|
||
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
||
PORT=$(( RANDOM % (MAX_PORT - MIN_PORT + 1) + MIN_PORT ))
|
||
|
||
if ! is_used "$PORT"; then
|
||
echo ""
|
||
echo "✅ Wolny port: $PORT"
|
||
|
||
if $SHOW_NEIGHBORS; then
|
||
echo ""
|
||
echo "📊 Sąsiednie porty:"
|
||
for OFFSET in -2 -1 1 2; do
|
||
NEIGHBOR=$(( PORT + OFFSET ))
|
||
if [ $NEIGHBOR -lt 1 ] || [ $NEIGHBOR -gt 65535 ]; then
|
||
printf " port %-6s — poza zakresem\n" "$NEIGHBOR"
|
||
elif is_used "$NEIGHBOR"; then
|
||
printf " port %-6s 🔴 zajęty\n" "$NEIGHBOR"
|
||
else
|
||
printf " port %-6s 🟢 wolny\n" "$NEIGHBOR"
|
||
fi
|
||
done
|
||
fi
|
||
|
||
echo ""
|
||
exit 0
|
||
fi
|
||
|
||
ATTEMPT=$(( ATTEMPT + 1 ))
|
||
done
|
||
|
||
echo "❌ Nie udało się znaleźć wolnego portu po $MAX_ATTEMPTS próbach."
|
||
exit 1
|