Linux komutu kullanılmayan bağlantı noktasını al


20

Ubuntu linux sistemimde kullanılmayan bir bağlantı noktası döndüren bir komut veya komut dosyası arıyorum. İnternette baktım ve bulduğum tek şey nestat komutuyla kullanılan / Dinle bağlantı noktası hakkında. Görünüşe göre netstat komutu ile bir şey işe yarayacak, ama tam olarak ne olduğunu bilmiyorum. Nasıl olduğu hakkında bir fikrin var mı?

Teşekkürler.



1
Bunu tam olarak neden yapman gerekiyor? Bir sunucu geliştiriyorsanız, bağlantı noktası 0'a bağlanabilirsiniz ve işletim sistemi sizin için ücretsiz bir bağlantı noktası tahsis edecektir, arayacağınız bir şey yoktur. Aksi takdirde arama ve ardından ciltleme yarış koşullarına eğilimlidir. Örneğin, bkz. Stackoverflow.com/questions/1365265/… veya stackoverflow.com/questions/1075399/…
Patrick Mevzek

Yanıtlar:


14

netstat -latdinleme ve yerleşik bağlantı noktalarının tam listesini verir .

Bir bağlantı noktası bu durumların hiçbirinde olmadığında sistem için mevcut olmadığından, kullanılmayan bağlantı noktalarının listesini gösteren bir komut bulamazsınız.

65535 bağlantı noktası olduğunu unutmayın, bu nedenle açık olmayan her şey netstat -latkullanılmayan bir bağlantı noktasıdır.

Aşağıdaki bash betiği, tcp bağlantı noktalarının basit bir taramasını yapacak ve hangilerinin açık ve hangilerinin kapalı olduğunu bildirecektir :

#!/bin/bash
IP=$1
first_port=$2
last_port=$3
function scanner

{
for ((port=$first_port; port<=$last_port; port++))
        do
                (echo >/dev/tcp/$IP/$port)> /dev/null 2>&1 && echo $port open || echo "$port closed"
        done
}

scanner

Eğer olarak kaydedin Eğer portscan.sh o zaman olarak çalıştırılmalıdır ./portscan.sh IP first_port last_port : Örneğin ./portscan 127.0.0.1 20 13520 135 kadar limanlarından tarar yerel ekipman


7

Ruby 2.x (tek katmanlı):

ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'

Şu anda makinemde şu yazılı:

42644

Sonraki bir çağrı yazdırıldı:

36168

Bu teknik, geçerli kullanıcının kullanılmayan bir bağlantı noktası istemesine ("0" bağlantı noktasına bağlanma) neden olur ve ardından işletim sisteminin sağladığı bağlantı noktası numarasını yazdırır. Mevcut kullanıcı soran kişi olduğundan, 1024'ün altındaki bağlantı noktaları döndürülmez (geçerli kullanıcı = kök değilse).

Kredi nerede kredi - bu çözüm unix.stackexchange.com üzerinde Franklin Yu tarafından yapılan bir yorum geliyor Kullanılmayan bir yerel bağlantı noktası bulmak için en kolay yolu nedir?


Bunun sonucunu bash betiğindeki bir değişkene nasıl atayabilirim?
Neil Stevens

export PORT = $ (ruby -e '"soket" gerektirir; Addrinfo.tcp ("", 0) .bind {| s | s.local_address.ip_port}')
G. Sylvie Davies

3

1025 ve 60000 arasında rasgele bir sayı oluşturan kısa bash betiği ve bu numara kullanılan bağlantı noktaları listesinde bulunana kadar döngüler. Bu, daha büyük portlara önyargısı olan hızlı ve kirli bir çözümdür:

CHECK="do while"

while [[ ! -z $CHECK ]]; do
    PORT=$(( ( RANDOM % 60000 )  + 1025 ))
    CHECK=$(sudo netstat -ap | grep $PORT)
done

echo $PORT

Grep komutunuzu kontrol edin, adarshr cevabı hakkındaki yoruma bakın
Nick

2

Tek astar

Hızla hizmet eden güzel bir tek astarı bir araya getirdim, keyfi bir aralıkta rastgele sayıda bağlantı noktası yakalamaya izin verdim (burada okunabilirlik için 4 satıra ayrılmıştır):

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"

Satır satır

commsıralanmış dosyaları iki dosyada karşılaştıran bir yardımcı programdır. Üç sütun çıkarır: yalnızca ilk dosyada görünen satırlar, yalnızca ikinci dosyada görünen satırlar ve ortak satırlar. Belirterek -23, sonraki sütunları bastırırız ve yalnızca ilk sütunu saklarız. Bunu, metin satırları dizisi olarak ifade edilen iki kümenin farkını elde etmek için kullanabiliriz. comm Burada öğrendim .

İlk dosya, aralarından seçim yapabileceğimiz bağlantı noktası aralığıdır. seqnumaralardan sıralanmış bir dizi üretir $FROMiçin $TO. Sonuç, işlem ikamesicomm kullanılarak ilk dosya olarak pipetlenir .

İkinci dosya biz çağırarak elde olduğunu, bağlantı noktalarının sıralı listesi ss(ile komutu -t, yani TCP bağlantı noktaları -a- kurulmuş ve dinleme - ve tüm anlam -n, kararlılığı, diyelim kalkmayın - sayısal 22etmek ssh). Daha sonra yalnızca awkyerel adresi ve bağlantı noktasını içeren dördüncü sütunu seçeriz . Biz kullanmak cutile bölünmüş adresi ve port için :sınırlayıcı ve ikincisi (sadece tutmak -f2). ssBiz tarafından kurtulmak olduğunu aynı şekilde bir başlık, grepSonra uymak artık 5'ten olan sayıların boş olmayan diziler için ping commtarafından 'ın gereksinimi sortsayısal ing ( -n) ve kopyaların kurtulmak alma uniq.

Şimdi sıralanan açık bağlantı noktalarının bir listesi var, shufsonra ilk "$HOWMANY"olanları kapmak için uçabiliriz head -n.

Misal

Özel aralıktaki üç rastgele açık bağlantı noktasını alın (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

örneğin geri dönebilir

54930
57937
51399

notlar

  • geçiş -tile -ude ssyerine serbest UDP portlarını alır.
  • shufRastgele bir bağlantı noktası almak istemiyorsanız bırakın

1
Ben senin tek astar gibi, bu sürüm düzgün IPv6 ayrıştırmak örneğin [:: 1]: 52792 ve grep yerine --no-header seçeneğini kullanın. gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
Filip Stefanov

1

Sadece tek bir rastgele kullanılmayan bağlantı noktası bulup bir listesini yazdırmam gerekiyordu. İşte benim bash çözümüm.

#/bin/bash

function random_unused_port {
    local port=$(shuf -i 2000-65000 -n 1)
    netstat -lat | grep $port > /dev/null
    if [[ $? == 1 ]] ; then
        export RANDOM_PORT=$port
    else
        random_unused_port
    fi
}

random_unused_port

Ve kaynak yaparak kullanın

$ . ./random_unused_port.sh; echo $RANDOM_PORT

Buradaki fikri seviyorum, ancak grep komutunuz niyetinizi döndürmeyecektir. İyi olan şey, muhafazakar olacaktır, ancak bir sonraki rastgele bağlantı noktası 2000 ise ve bağlantı noktası 2000 açıksa, ancak bağlantı noktası 20000 kullanılıyorsa, aramaya devam edecektir, bu nedenle sonuç mevcut bağlantı noktalarının tamamı olmayacaktır.
Nick

1

Belki kullanılan bağlantı noktaları listesine dayanan başka bir çözüm:

function random_unused_port {
   (netstat --listening --all --tcp --numeric | 
    sed '1,2d; s/[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*:\([0-9]*\)[[:space:]]*.*/\1/g' |
    sort -n | uniq; seq 1 1000; seq 1 65535
    ) | sort -n | uniq -u | shuf -n 1
}

RANDOM_PORT=$(random_unused_port)

netstatKomut tüm açık portlar bir listesini oluşturur. sedKomut kullanımı ve de olan bağlantı noktası numaralarını, özler sort/ uniqyapı getiri açık portlar bir uniq listesi. İkinci adım, 1'den başlayan ve 1000'de biten bağlantı noktası numaralarının bir listesini (ayrılmış bağlantı noktaları) ve 1'den 65535'e kadar başlayan tüm bağlantı noktası numaralarının ek bir listesini oluşturmaktır. Son liste, tüm kullanılabilir bağlantı noktalarını yalnızca bir kez içerir ve uniq -ubunları çıkarır. . Son olarak, shuf -n 1mevcut portların tam listesinden rastgele bir port seçecektir. Bununla birlikte, limanı rezerve etmeden önce bir yarış koşulu olacaktır.


1

Bir port numarasından başlayarak bir sonraki açık portu bulmam gerekiyordu; @Taras'ın çözümünü kullanmaya çalışıyorum.

_check="placeholder"
START_FROM=1900
PORT=$(( ( "$RANDOM" % 1000 ) + $START_FROM ))
while [[ ! -z "${_check}" ]]; do
    ((PORT++))
    _check=$(ss -tulpn | grep ":${PORT}")
done

0

Bağlantı noktanız 54321 ise:

sudo netstat -ap |grep 54321

Netstat kullanımının bazı varyasyonları burada bulunabilir .


Bu komut yalnızca 54321 numaralı bağlantı noktasının kullanılıp kullanılmadığını gösterir. İstediğim şey kullanılmayan limanı bulmak.
user2429082

Kullanılmayan belirsiz. Hangi bağlantı noktasını dinleyebileceğinizi kontrol etmek ister misiniz? Veya hangi bağlantı noktasına bağlanabilir? Kullanılmayanlar kullanılabilir. Kullanıcı olarak, 1024'ten büyük olanları, kök olarak kullanabilirsiniz,
1024'in
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.