หนึ่งในสายการบิน
ฉันได้รวบรวมหนึ่งซับที่ดีที่ตอบสนองวัตถุประสงค์ได้อย่างรวดเร็วช่วยให้คว้าหมายเลขพอร์ตโดยพลการในช่วงใดก็ได้ (ที่นี่แบ่งออกเป็น 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ถ้าคุณไม่สนใจที่จะจับพอร์ตแบบสุ่ม