คำสั่ง Linux รับพอร์ตที่ไม่ได้ใช้


20

ฉันกำลังมองหาคำสั่งหรือสคริปต์ที่ส่งคืนพอร์ตที่ไม่ได้ใช้ในระบบ ubuntu linux ของฉัน ฉันได้ดูบนอินเทอร์เน็ตและสิ่งเดียวที่ฉันพบคือเกี่ยวกับพอร์ตที่ใช้ / ฟังด้วยคำสั่ง nestat เห็นได้ชัดว่าบางสิ่งที่มีคำสั่ง netstat จะทำงานได้ แต่ไม่รู้ว่าอะไรกันแน่ ความคิดใด ๆ ได้อย่างไร

ขอบคุณ



1
ทำไมคุณต้องทำอย่างนั้น? หากคุณกำลังพัฒนาเซิร์ฟเวอร์คุณสามารถผูกเข้ากับพอร์ต 0 และระบบปฏิบัติการจะจัดสรรพอร์ตว่างให้คุณคุณไม่มีอะไรต้องค้นหา มิฉะนั้นการค้นหาและจากนั้นมีผลผูกพันกับสภาพการแข่งขัน ดูตัวอย่างstackoverflow.com/questions/1365265/…หรือstackoverflow.com/questions/1075399/…
Patrick Mevzek

คำตอบ:


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

หากคุณบันทึกเป็นportscan.shแล้วมันจะต้องทำงานเป็น./portscan.sh IP first_port last_portตัวอย่างเช่น: ./portscan 127.0.0.1 20 135จะสแกนอุปกรณ์ในท้องถิ่นจากพอร์ต 20-135


7

Ruby 2.x (หนึ่งซับ):

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

บนเครื่องของฉันทันทีที่พิมพ์:

42644

มีการพิมพ์คำขอร้องที่ตามมา:

36168

เทคนิคนี้ทำให้ผู้ใช้ปัจจุบันขอพอร์ตที่ไม่ได้ใช้ (ผูกกับพอร์ต "0") จากนั้นพิมพ์หมายเลขพอร์ตที่ระบบปฏิบัติการจัดเตรียมไว้ให้ และเนื่องจากผู้ใช้ปัจจุบันคือผู้ที่ขอพอร์ตที่ต่ำกว่า 1024 จะไม่ถูกส่งกลับ (เว้นแต่ผู้ใช้ปัจจุบัน = รูท)

เครดิตที่เครดิตครบกำหนด - โซลูชันนี้มาจากความคิดเห็นของFranklin Yuใน unix.stackexchange.com's วิธีที่ง่ายที่สุดในการค้นหาพอร์ตในเครื่องที่ไม่ได้ใช้คืออะไร


ฉันจะกำหนดผลลัพธ์ของสิ่งนี้ให้กับตัวแปรในสคริปต์ทุบตีได้อย่างไร
Neil Stevens

ส่งออก PORT = $ (ruby -e 'ต้องการ "socket"; ใส่ Addrinfo.tcp ("", 0) .bind {| s | s.local_address.ip_port}')
G. Sylvie Davies

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นอกจากนี้ยังส่งออกส่วนหัวที่เรากำจัดโดยgrepping สำหรับลำดับที่ไม่ว่างของตัวเลขที่ไม่เกิน 5 จากนั้นเราปฏิบัติตามcommข้อกำหนดของsortไอเอ็นจีโดยใช้ตัวเลข ( -n) และกำจัดการซ้ำซ้อนด้วยuniqและได้รับการกำจัดของรายการที่ซ้ำกันด้วย

ตอนนี้เรามีรายการที่เรียงลำดับของพอร์ตที่เปิดให้เราสามารถshufFLE ไปแล้วคว้าแรกคนที่มี"$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 และใช้ตัวเลือก --no-header แทน grep gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
Filip Stefanov

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

รูปแบบของการใช้ netstat สามารถพบได้ที่นี่


คำสั่งนี้จะแสดงให้ฉันเห็นเฉพาะเมื่อพอร์ต 54321 นั้นใช้งานหรือไม่ สิ่งที่ฉันต้องการค้นหาคือพอร์ตที่ไม่ได้ใช้
user2429082

ไม่ได้ใช้ไม่ชัดเจน คุณต้องการตรวจสอบพอร์ตใดบ้างที่พร้อมฟัง? หรือพอร์ตใดพร้อมใช้งานเพื่อเชื่อมต่อ สิ่งที่ไม่ได้ใช้จะมีให้ ในฐานะผู้ใช้คุณสามารถใช้รายการที่สูงกว่า 1024 ได้เช่นเดียวกับรูทคุณสามารถใช้รายการที่ต่ำกว่า 1024 ได้
Overmind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.