लिनक्स कमांड का अप्रयुक्त पोर्ट मिलता है


20

मैं एक कमांड या स्क्रिप्ट की तलाश कर रहा हूं, जो मेरे ubuntu linux सिस्टम पर अप्रयुक्त पोर्ट लौटाती है। मैंने इंटरनेट पर देखा है और केवल एक चीज जो मैंने पाया है वह नेस्टैट कमांड के साथ उपयोग / सुनो पोर्ट के बारे में है। जाहिरा तौर पर netstat कमांड के साथ कुछ काम करेगा लेकिन वास्तव में नहीं जानता। कोई विचार कैसे?

धन्यवाद।



1
आपको वास्तव में ऐसा करने की आवश्यकता क्यों है? यदि आप एक सर्वर विकसित कर रहे हैं, तो आप पोर्ट 0 से बांध सकते हैं और ओएस आपके लिए एक मुफ्त पोर्ट आवंटित करेगा, आपके पास खोज करने के लिए कुछ भी नहीं है। अन्यथा खोज और फिर बाध्यकारी दौड़ की स्थिति के लिए प्रवण है। उदाहरण के लिए देखें stackoverflow.com/questions/1365265/… या stackoverflow.com/questions/1075399/…
पैट्रिक मेवज़ेक

जवाबों:


14

netstat -latसुनने और स्थापित बंदरगाहों की पूरी सूची देता है ।

जब कोई पोर्ट उन राज्यों में से किसी पर नहीं है, तो सिस्टम के लिए मौजूद नहीं है, इसलिए आपको एक कमांड नहीं मिलेगी जो अप्रयुक्त पोर्ट की सूची दिखाती हो।

ध्यान रखें कि 65535 पोर्ट हैं, इसलिए ऐसा कुछ भी नहीं netstat -latहै जो अप्रयुक्त पोर्ट है।

निम्नलिखित बैश स्क्रिप्ट tcp पोर्ट का एक सरल स्कैन करेगी , और आपको बताएगी कि कौन सी खुली हैं और कौन सी बंद हैं :

#!/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

यदि आप इसे portcan.sh के रूप में सहेजते हैं, तो इसे निम्न के रूप में चलाया जाना चाहिए ./portscan.sh IP first_port last_port , उदाहरण के लिए: ./portscan 127.0.0.1 20 13520 से 135 तक स्थानीय उपकरणों को स्कैन करेगा


7

रूबी 2.x (वन-लाइनर):

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

मेरी मशीन पर अभी जो छपा है:

42644

एक बाद का आह्वान मुद्रित:

36168

यह तकनीक वर्तमान उपयोगकर्ता को अप्रयुक्त पोर्ट ("0" पोर्ट के लिए बाइंड) का अनुरोध करने का कारण बनती है, और फिर उस पोर्ट संख्या को प्रिंट करती है जो ऑपरेटिंग सिस्टम प्रदान करता है। और चूंकि वर्तमान उपयोगकर्ता एक पूछ रहा है, 1024 से नीचे के बंदरगाहों को वापस नहीं किया जाएगा (जब तक कि वर्तमान उपयोगकर्ता = रूट नहीं)।

क्रेडिट जहां क्रेडिट की देयता है - यह समाधान फ्रैंकलिन यू द्वारा unix.stackexchange.com पर एक टिप्पणी से आया है, एक अप्रयुक्त स्थानीय बंदरगाह को खोजने का सबसे आसान तरीका क्या है?


मैं कैसे एक बैश स्क्रिप्ट में एक चर के लिए इस का परिणाम बता सकता है?
नील स्टीवंस

निर्यात PORT = $ (रूबी-ई 'के लिए "सॉकेट" की आवश्यकता होती है; Addrinfo.tcp ("", 0); .bind {! s; s |। local_address.ip_port}') डालता है
जी।

3

शॉर्ट बैश स्क्रिप्ट जो यादृच्छिक रूप से 1025 और 60000 के बीच एक संख्या उत्पन्न करती है और तब तक लूप करती है जब तक कि उस नंबर का उपयोग किए गए पोर्ट की सूची में नहीं मिलता है। यह एक त्वरित 'एन गंदा समाधान है जिसमें बड़े बंदरगाहों के लिए पूर्वाग्रह है:

CHECK="do while"

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

echo $PORT

अपने grep कमांड की जाँच करें, adarshr जवाब पर टिप्पणी देखें
निक

2

एक लाइन

मैंने एक अच्छा वन-लाइनर लगाया है जो जल्दी से उद्देश्य को पूरा करता है, एक मनमाना रेंज में बंदरगाहों की एक मनमानी संख्या को हड़पने की अनुमति देता है (यहां पठनीयता के लिए इसे 4 लाइनों में विभाजित किया गया है):

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"

पंक्ति दर पंक्ति

commएक उपयोगिता है जो दो फाइलों में क्रमबद्ध लाइनों की तुलना करती है। यह तीन स्तंभों को आउटपुट करता है: लाइनें जो केवल पहली फ़ाइल में दिखाई देती हैं, लाइनें जो केवल दूसरे एक और आम लाइनों में दिखाई देती हैं। निर्दिष्ट करके -23हम बाद के कॉलमों को दबाते हैं और केवल पहले वाले को रखते हैं। इसका उपयोग हम दो पंक्तियों के अंतर को प्राप्त करने के लिए कर सकते हैं, जिसे पाठ पंक्तियों के अनुक्रम के रूप में व्यक्त किया जाता है। मैंने comm यहां के बारे में सीखा ।

पहली फ़ाइल बंदरगाहों की श्रेणी है जिसे हम चुन सकते हैं। seqसे संख्या का एक क्रमबद्ध अनुक्रम का उत्पादन $FROMकरने के लिए $TOप्रक्रिया प्रतिस्थापन केcomm उपयोग से पहली फ़ाइल के रूप में परिणाम को पाइप किया जाता है ।

दूसरी फ़ाइल बंदरगाहों में से क्रमबद्ध सूची, कि हम फोन करके प्राप्त है ss(के साथ आदेश -tअर्थ TCP पोर्ट, -a- स्थापना की और सुनने - और सभी अर्थ -nसंख्यात्मक - संकल्प, कहते हैं की कोशिश न करें, 22करने के लिए ssh)। हम तब केवल चौथे कॉलम को चुनते हैं awk, जिसमें स्थानीय पता और पोर्ट होता है। हम cutपता और पोर्ट को :सीमांकित के साथ विभाजित करने और केवल बाद वाले ( -f2) को रखने के लिए उपयोग करते हैं । ssएक हेडर को भी आउटपुट करें, कि हम grepसंख्याओं के गैर-खाली अनुक्रमों के लिए पिंग द्वारा छुटकारा पाएं जो अब 5 से अधिक नहीं हैं। फिर हम संख्यात्मक रूप से ( ) के साथ डुप्लिकेट से छुटकारा पाने की commआवश्यकता का अनुपालन करते हैं ।sort-nuniq

अब हमारे पास खुले बंदरगाहों की सूची है, जिसे हम shufपहले "$HOWMANY"वाले हड़पने के लिए उड़ सकते हैं head -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

उदाहरण के लिए लौट सकते हैं

54930
57937
51399

टिप्पणियाँ

  • स्विच -tके साथ -uमें ssबजाय मुक्त UDP पोर्ट मिलता है।
  • ड्रॉप shufअगर आप एक यादृच्छिक बंदरगाह को हथियाने में रुचि नहीं रखते हैं

1
मुझे आपका वन-लाइनर पसंद है, यह संस्करण ठीक से IPv6 को पार्स करता है जैसे [:: 1]: 52792 और grep के बजाय -no- हेडर विकल्प का उपयोग करें। gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
फिलिप

1

मुझे केवल एक यादृच्छिक अप्रयुक्त बंदरगाह खोजने की जरूरत है और उनमें से एक सूची को प्रिंट नहीं करना है। यहाँ मेरा बैश समाधान है।

#/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

और इसे सोर्स करके इस्तेमाल करें

$ . ./random_unused_port.sh; echo $RANDOM_PORT

मुझे यहां विचार पसंद है, हालांकि आपका grep कमांड वापस नहीं आएगा जो आप चाहते हैं। अच्छी बात यह है कि यह रूढ़िवादी होगा, लेकिन यदि अगला यादृच्छिक पोर्ट 2000 है, और पोर्ट 2000 खुला है, लेकिन पोर्ट 20000 उपयोग में है, तो यह दिखता रहेगा, इसलिए परिणाम उपलब्ध पोर्ट की पूरी श्रृंखला नहीं होगी।
निक

1

शायद इस्तेमाल किए गए बंदरगाहों की सूची के आधार पर एक और समाधान:

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)

netstatआदेश सभी खुले बंदरगाहों में से एक सूची बनाता है। sedआदेश पोर्ट संख्या है, जो इस्तेमाल करते हैं और कर रहे हैं अर्क sort/ uniqनिर्माण रिटर्न खुला बंदरगाहों में से एक uniq सूची। दूसरा चरण 1 पर शुरू होने वाले पोर्ट नंबरों की सूची बनाना और 1000 (आरक्षित बंदरगाहों) पर खत्म करना और 1 से 65535 तक शुरू होने वाले सभी पोर्ट नंबरों की एक अतिरिक्त सूची है। अंतिम सूची में केवल एक बार सभी उपलब्ध पोर्ट शामिल हैं और uniq -uउन्हें निकालेगा । अंतिम, shuf -n 1उपलब्ध पोर्ट की पूरी सूची में से एक यादृच्छिक पोर्ट को चुन लेगा। फिर भी, एक दौड़ की स्थिति होगी, इससे पहले कि कोई बंदरगाह को आरक्षित करने में सक्षम हो।


1

मुझे अगले ओपन पोर्ट को पोर्ट नंबर से शुरू करने की आवश्यकता थी; यहाँ @Taras के समाधान का उपयोग करने का मेरा प्रयास है।

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

0

यदि 54321 आपका पोर्ट है, तो रन करें:

sudo netstat -ap |grep 54321

नेटस्टैट का उपयोग करने के कुछ रूपांतर यहां देखे जा सकते हैं


यह कमांड केवल मुझे दिखाएगा कि पोर्ट 54321 का उपयोग है या नहीं। मैं जो चाहता हूं, वह अप्रयुक्त बंदरगाह है।
user2429082 13

अप्रयुक्त अस्पष्ट है। आप यह देखना चाहते हैं कि कौन सा पोर्ट सुनने के लिए उपलब्ध है? या किस पोर्ट से कनेक्ट करने के लिए उपलब्ध हैं? जो भी उपयोग में नहीं हैं वे उपलब्ध हैं। उपयोगकर्ता के रूप में, आप 1024 से ऊपर के लोगों का उपयोग कर सकते हैं, मूल के रूप में, आप 1024 के तहत भी लोगों का उपयोग कर सकते हैं।
ओवरमाइंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.