มีคำสั่งใดบ้างที่ฉันสามารถเรียกใช้จาก bash ที่จะบอกฉันว่าพอร์ตเปิดอยู่หรือไม่?
มีคำสั่งใดบ้างที่ฉันสามารถเรียกใช้จาก bash ที่จะบอกฉันว่าพอร์ตเปิดอยู่หรือไม่?
คำตอบ:
ใช้ "netstat" เพื่อตรวจสอบพอร์ตที่ใช้อยู่ในปัจจุบัน
netstat -antp Proto Recv-Q ผู้ส่งในท้องถิ่นที่อยู่ต่างประเทศที่อยู่รัฐชื่อ PID / ชื่อโปรแกรม tcp 0 0 xxx.xxx.xxx.xxx 0.0.0.0:* LISTEN 16297 / ตั้งชื่อ tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 / ชื่อ tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 / ชื่อ tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 16297 / ตั้งชื่อ
นี่ (netstat) เป็นทางออกที่เร็วที่สุด ...
netstat -lnt
... แต่สิ่งนี้จะช่วยให้คุณสามารถควบคุมได้มากขึ้น (ที่ความเร็ว (บางครั้งมีความเร็วมาก)) ...
lsof -n -i -a -u www-data
ตัวอย่างด้านบนแสดงตัวอย่างพอร์ต TCP ทั้งหมดที่เปิดและอยู่ในLISTEN
สถานะ AND ( -a
) ที่เป็นของwww-data
ผู้ใช้Apache ( )
ลอง
lsof -i :<port number>
หากคุณได้รับผลลัพธ์ใด ๆ สิ่งที่ฟังและผูกพันเช่น
# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1833 nobody 3u IPv4 51091229 0t0 TCP odessa.cheney.net:http->79.173.188.214:52918 (ESTABLISHED)
nginx 1833 nobody 5u IPv4 46221856 0t0 TCP odessa.cheney.net:http->66.36.243.182:37876 (CLOSE_WAIT)
nginx 1833 nobody 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 1833 nobody 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
nginx 1833 nobody 14u IPv4 46221857 0t0 TCP odessa.cheney.net:http->66.36.243.182:37880 (CLOSE_WAIT)
nginx 1833 nobody 15u IPv4 51091030 0t0 TCP odessa.cheney.net:http->msnbot-65-55-106-132.search.msn.com:51708 (ESTABLISHED)
nginx 11832 root 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 11832 root 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
netstat -tlnp
แสดงt
พอร์ต cp ที่l
istening แสดงn
หมายเลขเท่านั้น (ไม่แก้ไขชื่อ - ทำให้เร็วขึ้น) และแสดงp
rocess ที่กำลังฟัง ( p
ทำงานได้ดีถ้าคุณรูท)
netstat -ulnp
แสดงu
พอร์ต dp ที่l
istening แสดงn
หมายเลขเท่านั้น (ไม่แก้ไขชื่อ - ทำให้เร็วขึ้น) และแสดงp
rocess ที่กำลังฟัง ( p
ทำงานได้ดีถ้าคุณรูท)
netstat -unp
แสดงu
พอร์ต dp ที่เปิดอยู่ แต่ไม่ฟังแสดงn
เฉพาะตัวเลข (ไม่แก้ไขชื่อ - ทำให้เร็วขึ้น) และแสดงp
rocess ที่กำลังฟัง ( p
ทำงานได้ดีถ้าคุณรูท)
netstat -an
แสดงa
พอร์ตที่ใช้งานอยู่แสดงn
เฉพาะตัวเลข - ไม่ต้องแก้ไขชื่อ
lsof -i <proto>@<host>:<port>
เช่น
lsof -i tcp@localhost:25
เพื่อดูว่ามีอะไรกำลังฟังอยู่บนพอร์ต localhost 25 / TCP หรือ
lsof -i tcp@0.0.0.0:636
เพื่อดูว่ามีซ็อกเก็ตใด ๆ ทั้งในตัวเครื่องหรือจากระยะไกลไม่ว่าจะฟัง (ในพื้นที่) หรือเชื่อมต่อกับ (ภายในหรือระยะไกล) สำหรับโฮสต์ / อินเตอร์เฟสใด ๆ
lsof (เปิดรายการไฟล์) เป็นเครื่องมือที่ดีในการดูว่ากระบวนการกำลังรับฟังพอร์ตอยู่หรือไม่
lsof -P | grep: <port-number>
netstat เป็นเครื่องมือที่ดีสำหรับการดูว่ามีการเชื่อมต่อที่ใช้งานอยู่หรือไม่
netstat -n | grep: <port-number>
คุณไม่ได้พูดถึงโพรโทคอลที่คุณต้องการใช้เช่น TCP หรือ UDP และเป็นสิ่งสำคัญที่จะต้องตระหนักว่า "พอร์ต" นั้นค่อนข้างไม่ละเอียดนักเนื่องจากระบบรองรับการแก้ปัญหาซ็อกเก็ต เช่นหากระบบของคุณมีที่อยู่ IP หลายแห่งพอร์ต 80 อาจถูกใช้กับที่อยู่ IP ทั้งหมด (แอปพลิเคชันนั้นผูกกับ "0.0.0.0" หรือ "::" หรือต่อจากที่อยู่ IP แต่ละรายการอย่างต่อเนื่อง) หรืออาจอยู่ใน ใช้เฉพาะในส่วนย่อยของที่อยู่ IP เหล่านั้น
วิธีที่ดีที่สุดและแน่นอนที่สุดในการพิจารณาว่าพอร์ต / ที่อยู่นั้นว่างและพร้อมใช้งานหรือไม่ Netcat มีประโยชน์สำหรับสิ่งนี้
nc -l [-s abcd] -p NN
จะพยายามผูกกับพอร์ต TCP NN บน (เป็นทางเลือกค่าเริ่มต้นจะเป็นที่อยู่ทั้งหมด) abcd เพิ่มตัวเลือก -u เพื่อทำเช่นเดียวกันใน UDP
ถัดไปเพื่อบอกว่าพอร์ตนั้น "เปิด" อย่างแท้จริงตามที่คุณถามหรือไม่คุณต้องเริ่มดูกฎไฟร์วอลล์ที่อาจเกิดขึ้นได้ อีกสิ่งที่ง่ายที่สุดคือพยายามเชื่อมต่อกับพอร์ต ใช้ netcat ข้างต้นบนเซิร์ฟเวอร์และจากไคลเอนต์ใช้ netcat เพื่อพยายามเชื่อมต่อกับพอร์ตที่คุณเปิด
nc [-u] abcd NN
จะเชื่อมต่อกับพอร์ต NN บน abcd โดยใช้ UDP หากระบุแฟล็ก -u จากนั้นคุณสามารถพิมพ์อินพุตลงในส่วนท้ายไคลเอ็นต์และควรแสดงบนเซิร์ฟเวอร์ หากไม่เป็นเช่นนั้นคุณจะต้องค้นหาเครื่องมือเฉพาะระบบและเครือข่าย
ฉันใช้fuser (ในแพ็คเกจ psmisc):
fuser -n tcp PORT
นำกลับpidของกระบวนการที่โยงกับพอร์ตนี้
ถ้านี่คือการรู้ว่าพอร์ตกำลังฟังหรือไม่telnet ตัวเก่าที่ดีจะใช้กลลวง :)
telnet 127.0.0.1 PORT
ซับในตัวนี้จะแสดงรายการพอร์ต TCP ทั้งหมดที่ใช้งานอยู่ มันทำงานได้ดีใน Ubuntu และ OS X
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
รายการจะมีหนึ่งพอร์ตต่อบรรทัดโดยไม่มีข้อมูลเพิ่มเติม
for port in $(netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq); do echo EXECUTE COMMAND FOR PORT $port; done
มีวิธีการมากมายที่ทำให้ฉันมีปัญหาเพราะพวกเขาไม่ได้ทำงานกับ linux และ osx และ / หรือเพราะพวกเขาไม่ได้แสดงพอร์ตที่ใช้โดยนักเทียบท่าหรือกระบวนการที่รูทเป็นเจ้าของ ตอนนี้ฉันเพิ่งใช้โปรแกรมจาวาสคริปต์นี้:
(ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งโหนดและใช้งานnode
ได้กับไม่ใช่nodejs
หรือเปลี่ยนโปรแกรมตาม)
บันทึกสิ่งต่อไปนี้ลงในไฟล์ที่เรียกว่าcheck-port
ในเส้นทางของคุณหรือในโครงการของคุณ
#!/usr/bin/env node
var http = require('http');
var app = new http.Server();
app.listen(process.argv[2], () => {
process.exit(0)
});
ตั้งค่าการอนุญาต
chmod +x path/to/check-port
วิ่งออกจากเส้นทางของคุณ
check-port 8080
หรือเรียกใช้จากไดเรกทอรีเดียวกัน
./check-port 8080
จนถึงตอนนี้มันใช้งานได้ค่อนข้างดี