ฉันจะตรวจสอบว่าพอร์ตใดที่ไม่ว่างและพอร์ตใดที่ว่างบนเครื่อง Linux ของฉันได้อย่างไร


26

มีคำสั่ง command line หรือวิธีอื่นในการค้นหาและแสดงรายการหมายเลขพอร์ตไม่ว่างและว่างบนเครื่อง Linux ของฉันหรือไม่

คำตอบ:


40

คำสั่ง

netstat -antu

จะแสดงพอร์ต tcp และ udp ทั้งหมดที่ใช้งานอยู่ ผลลัพธ์จะมีลักษณะดังนี้:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN

หมายเลขหลังเครื่องหมายโคลอนในฟิลด์ Local Address แสดงพอร์ตที่ใช้งานอยู่ หากสถานะเป็น "LISTEN" หมายถึงพอร์ตที่ใช้สำหรับการเชื่อมต่อขาเข้า หากที่อยู่ IP ใน Local Address ฟิลด์คือ 0.0.0.0 มันหมายความว่าการเชื่อมต่อขาเข้าจะได้รับการยอมรับในที่อยู่ IP ใด ๆ ที่กำหนดให้กับอินเทอร์เฟซ - ดังนั้นนี่หมายความว่าจากการเชื่อมต่อที่เกิดขึ้นนอกเครื่องของคุณ

ถ้ามันบอกว่า localhost หรือ 127.0.0.1 มันจะยอมรับเฉพาะการเชื่อมต่อจากเครื่องของคุณ

นอกจากนี้หากคุณเพิ่ม -p พารามิเตอร์และเรียกใช้เป็นรูทจะแสดงกระบวนการที่เปิดพอร์ต:

$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN      860/rpc.statd

สิ่งใดก็ตามที่ไม่ได้แสดงว่ากำลังใช้งานอยู่ฟรี แต่ผู้ใช้ (บัญชีที่ไม่มีสิทธิพิเศษ) สามารถเปิดพอร์ตที่สูงกว่า 1,023


มันหมายความว่าการเชื่อมต่อเข้ามาจะได้รับการยอมรับ บนที่อยู่ IP ใด ๆ ที่กำหนดให้กับอินเทอร์เฟซ - ดังนั้นสิ่งนี้จึงมาจาก การเชื่อมต่อที่เกิดขึ้นนอกเครื่องของคุณ คุณไม่ได้ทำผิดที่นี่เหรอ? คุณอาจหมายถึงว่าการเชื่อมต่อนั้นจะได้รับการยอมรับหากมีที่อยู่ใด ๆ ที่กำหนดให้กับอินเทอร์เฟซที่กำหนด ที่มาของการเชื่อมต่อขาเข้าอาจระบุไว้ในคอลัมน์ถัดไปที่อยู่ต่างประเทศ ดังนั้นจึงมีถ้ามี 0.0.0.0 เป็นค่าก็หมายความว่าการเชื่อมต่อจะได้รับการยอมรับจากทุกที่รวมถึงด้านนอกของเครื่อง
user907860

1
@ user907860 อาจไม่ชัดเจน แต่ความแตกต่างที่ฉันทำอยู่ระหว่าง 0.0.0.0 เทียบกับ 127.0.0.1 - หลังจะยอมรับการเชื่อมต่อจากเครื่องของคุณเท่านั้นเพราะกำลังฟังที่อยู่ IP ที่ไม่มีการกำหนด เมื่อ 0.0.0.0 หมายถึงที่อยู่ใด ๆ ในเครื่องของคุณและหากมีการกำหนดเส้นทางไว้การเชื่อมต่อสามารถทำได้จากเครื่องอื่น
Paul

เพียงแค่ FYI -antu สามารถเขียนเป็น -tuna
Abdennour TOUMI


7

วิธีที่ดีและเชื่อถือได้ในการตรวจสอบพอร์ตที่เปิดใช้อยู่ ss (แทนที่สำหรับ เลิกใช้ netstat ) สามารถใช้งานได้ในสคริปต์โดยไม่ต้องมีสิทธิ์ระดับสูง (เช่น sudo )

การใช้งาน: ตัวเลือก -l สำหรับการฟังพอร์ตตัวเลือก -n เพื่อข้ามการแก้ไข DNS และตัวกรองบนพอร์ตต้นทาง NN: src :NN (แทนที่ NN โดยพอร์ตที่คุณต้องการตรวจสอบ) สำหรับตัวเลือกเพิ่มเติมให้ดู man ss

ss -ln src :NN

ตัวอย่าง:

[user@server ~]# ss -ln src :80
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port
LISTEN      0      128                      *:80                *:*
[user@server ~]# ss -ln src :81
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port

และในสคริปต์โดยใช้ grep เราสามารถทดสอบว่าเอาต์พุตมีพอร์ตที่เราร้องขอ ตัวอย่างที่มีการใช้งานพอร์ต 80 (ดูด้านบน):

myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 80 is in use (result == 1)

ตัวอย่างที่ไม่ได้ใช้พอร์ต 81 (ดูด้านบน)

myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 81 is NOT in use (result == 0)

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