লিনাক্স কমান্ড অব্যবহৃত পোর্ট পেতে


20

আমি একটি কমান্ড বা স্ক্রিপ্ট খুঁজছি যা আমার উবুন্টু লিনাক্স সিস্টেমে একটি অব্যবহৃত পোর্ট দেয়। আমি ইন্টারনেটে সন্ধান করেছি এবং নেস্টেট কমান্ড সহ ব্যবহৃত / শ্রবণ পোর্ট সম্পর্কে আমি কেবলমাত্র খুঁজে পাচ্ছি। স্পষ্টতই নেটস্যাট কমান্ডের সাহায্যে কিছু কাজ করবে তবে ঠিক কী হবে তা জানে না। কোন ধারণা কিভাবে?

ধন্যবাদ।



1
আপনার ঠিক এমনটি করা দরকার কেন? যদি আপনি কোনও সার্ভার বিকাশ করে থাকেন তবে আপনি 0 বন্দরটি আবদ্ধ করতে পারেন এবং ওএস আপনার জন্য একটি বিনামূল্যে পোর্ট বরাদ্দ করবে, আপনার অনুসন্ধানের কিছুই নেই to অন্যথায় অনুসন্ধান এবং তারপরে বাইন্ডিং জাতি শর্তগুলির জন্য প্রবণ। উদাহরণস্বরূপ দেখুন stackoverflow.com/questions/1365265/... বা stackoverflow.com/questions/1075399/...
প্যাট্রিক Mevzek

উত্তর:


14

netstat -latশ্রবণপ্রতিষ্ঠিত পোর্টগুলির সম্পূর্ণ তালিকা দেয় ।

যখন কোনও বন্দর সেই সমস্ত রাজ্যের কোনও অবস্থাতেই না থাকে তখন সিস্টেমের জন্য উপস্থিত থাকে না, সুতরাং আপনি এমন একটি আদেশ পাবেন না যা অব্যবহৃত পোর্টগুলির তালিকা দেখায়।

মনে রাখবেন যে এখানে 65535 বন্দর রয়েছে, তাই যা কিছু নেই তা netstat -latঅব্যবহৃত পোর্ট।

নিম্নলিখিত বাশ স্ক্রিপ্টটি টিসিপি পোর্টগুলির একটি সাধারণ স্ক্যান করবে এবং আপনাকে জানায় যে কোনটি উন্মুক্ত এবং কোনটি বন্ধ রয়েছে :

#!/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 127.0.0.1 20 135পোর্ট 20 থেকে 135 পর্যন্ত স্থানীয় সরঞ্জামগুলি স্ক্যান করবে


7

রুবি ২.x (এক-লাইনার):

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

আমার মেশিনে এখনই মুদ্রিত:

42644

পরবর্তী অনুরোধটি মুদ্রিত:

36168

এই কৌশলটি বর্তমান ব্যবহারকারীকে অব্যবহৃত পোর্ট ("0" পোর্টে বাঁধাই) অনুরোধ করার জন্য এবং তারপরে অপারেটিং সিস্টেমটি সরবরাহ করে এমন পোর্ট নম্বর প্রিন্ট করে। এবং যেহেতু বর্তমান ব্যবহারকারী একজনকে জিজ্ঞাসা করছেন, 1024 নীচের পোর্টগুলি ফেরত দেওয়া হবে না (বর্তমান ব্যবহারকারী = রুট ব্যতীত)।

ক্রেডিট যেখানে credit ণ পরিশোধের জন্য - এই সমাধানটি unix.stackexchange.com এর ফ্র্যাঙ্কলিন ইউ-র একটি মন্তব্য থেকে এসেছে অব্যবহৃত স্থানীয় বন্দরটি খুঁজে পাওয়ার সহজতম উপায় কী?


আমি কীভাবে এর ফলাফলটিকে ব্যাশ স্ক্রিপ্টের একটি পরিবর্তনশীলকে নির্ধারণ করতে পারি?
নিল স্টিভেন্স

রপ্তানি পোর্ট = $ (রুবি -e ' "সকেট" প্রয়োজন; রাখে Addrinfo.tcp ( "", 0) .bind {| গুলি | s.local_address.ip_port}')
জি সিলভী ডেভিস

3

শর্ট বাশ স্ক্রিপ্ট যা এলোমেলোভাবে 1025 এবং 60000 এর মধ্যে একটি সংখ্যা উত্পন্ন করে এবং লুপগুলি ব্যবহৃত পোর্টগুলির তালিকায় পাওয়া না যাওয়া পর্যন্ত লুপ হয়। এটি একটি দ্রুত 'n নোংরা সমাধান যা বৃহত বন্দরগুলির পক্ষপাত রয়েছে has

CHECK="do while"

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

echo $PORT

আপনার গ্রেপ কমান্ডটি দেখুন, আদর্শ উত্তরের মন্তব্য দেখুন
নিক

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একটি শিরোনাম আউটপুট দেয়, যে আমরা grep5 টির চেয়ে বেশি নম্বরের খালি খালি অনুক্রমের জন্য পিং দিয়ে মুক্তি পেয়েছি then আমরা তারপরে সংখ্যায় ( ) ব্যবহার করে এবং ডুপ্লিকেটগুলি থেকে মুক্তি পেয়ে commপ্রয়োজনীয় প্রয়োজনীয়তা মেনে sortচলি ।-nuniq

এখন আমরা যে আমরা করতে পারেন খোলা পোর্ট একটি সাজানো তালিকা আছে, shufতারপর প্রথম দখল করতে fle "$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সঙ্গে -ussপরিবর্তে বিনামূল্যে UDP পোর্ট জন্য।
  • shufআপনি যদি এলোমেলো বন্দর দখল করতে আগ্রহী না হন তবে ড্রপ করুন

1
আমি আপনার ওয়ান-লাইনারটি পছন্দ করি, এই সংস্করণটি আইপিভি 6 টি যথাযথভাবে পার্স করতে পারে যেমন [:: 1]: 52792 এবং গ্রেপের পরিবর্তে --no-header বিকল্পটি ব্যবহার করুন। 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

আমি এখানে ধারণাটি পছন্দ করি, তবে আপনার গ্রেপ কমান্ডটি আপনি যা চান তা ফিরিয়ে দেবে না। ভাল কথাটি হ'ল এটি রক্ষণশীল হবে তবে পরবর্তী র্যান্ডম বন্দরটি যদি 2000 হয় এবং পোর্ট 2000 খোলা থাকে তবে 20000 বন্দরটি ব্যবহৃত হয় তবে এটি অনুসন্ধান চালিয়ে যাবে, সুতরাং ফলাফল উপলব্ধ পোর্টগুলির সম্পূর্ণ পরিসীমা হবে না।
নিক 16

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 থেকে শুরু এবং (সংরক্ষিত পোর্ট) এবং শুধুমাত্র একবার সমস্ত উপলব্ধ পোর্ট 65535. 1 আপ থেকে শুরু চূড়ান্ত তালিকা রয়েছে সব পোর্ট সংখ্যার একটি অতিরিক্ত তালিকা এবং 1000 এ শেষ হচ্ছে বন্দর সংখ্যার একটি তালিকা তৈরি করতে হয় uniq -uতাদের উত্থিত করব । সর্বশেষে, shuf -n 1উপলব্ধ পোর্টগুলির সম্পূর্ণ তালিকা থেকে একটি এলোমেলো বন্দরটি বেছে নেবে। তবুও, একটি বন্দর সংরক্ষণ করার আগে সক্ষম হওয়ার আগে একটি রেসের শর্ত থাকবে।


1

আমি একটি পোর্ট নম্বর থেকে শুরু করে পরবর্তী খোলা পোর্টটি সন্ধান করতে হবে; এখানে @ তারাসের সমাধানটি ব্যবহার করার চেষ্টা করা হচ্ছে।

_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 ব্যবহার হয় বা না হয়। আমি যা চাই তা হ'ল অব্যবহৃত বন্দর।
ব্যবহারকারী 2429082

অব্যবহৃত হয় অস্পষ্ট। আপনি শুনতে চান যে কোন বন্দর শোনার জন্য উপলব্ধ? বা কোন বন্দর সংযোগ করার জন্য উপলব্ধ? যেগুলি ব্যবহারে নেই সেগুলি উপলভ্য। ব্যবহারকারী হিসাবে, আপনি 1024 উপরে বেশী ব্যবহার করতে পারি রুট হিসাবে, এছাড়াও আপনি বেশী 1024. অধীনে ব্যবহার করতে পারেন
Overmind
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.