利用Python進行埠掃瞄

2021-09-08 07:18:29 字數 3088 閱讀 4705

在linux中判斷一台主機是否可達,可以使用ping命令,而判斷埠是否開啟,可以使用telnet命令,但是telnet命令沒有超時時間的引數,使用起來不是很方便,那麼可以利用python來完成乙個埠掃瞄的功能

#!/usr/bin/env python

import socket

def get_ip_status(ip,port):

server = socket.socket(socket.af_inet, socket.sock_stream)

try:

server.connect((ip,port))

print(' port is open'.format(ip, port))

except exception as err:

print(' port is not open'.format(ip,port))

finally:

server.close()

if __name__ == '__main__':

host = '10.0.0.11'

for port in range(20,100):

get_ip_status(host,port)

上面使用的是python的socket模組完成的埠檢測, 其實python的內建模組telnetlib也可以完成埠檢測任務

import telnetlib

def get_ip_status(ip,port):

server = telnetlib.telnet() # 建立乙個telnet物件

try:

server.open(ip,port) # 利用telnet物件的open方法進行tcp鏈結

print(' port is open'.format(ip, port))

except exception as err:

print(' port is not open'.format(ip,port))

finally:

server.close()

if __name__ == '__main__':

host = '10.0.0.11'

for port in range(20,100):

get_ip_status(host,port)

當然上面這兩種方式都是序列執行的,這在多ip多埠的情況下是非常慢得,所以引入多執行緒threading模組。

#!/usr/bin/env python

import telnetlib

import threading

def get_ip_status(ip,port):

server = telnetlib.telnet()

try:

server.open(ip,port)

print(' port is open'.format(ip, port))

except exception as err:

print(' port is not open'.format(ip,port))

finally:

server.close()

if __name__ == '__main__':

host = '10.0.0.11'

threads =

for port in range(20,100):

t = threading.thread(target=get_ip_status,args=(host,port))

t.start()

for t in threads:

t.join()

前面的例子中我們的程式為每個ip的每個埠建立乙個執行緒,在ip和port較多的時候,會暴露出各種問題(比如頻繁的上下文切換),因此,我們需要限制程序數量,那麼可以利用queue模組。

#!/usr/bin/env python

import telnetlib

import threading

import queue

def get_ip_status(ip):

server = telnetlib.telnet()

for port in range(20,100):

try:

server.open(ip,port)

print(' port is open'.format(ip, port))

except exception as err:

print(' port is not open'.format(ip,port))

finally:

server.close()

def check_open(q):

try:

while true:

ip = q.get_nowait()

get_ip_status(ip)

except queue.empty as e:

pass

if __name__ == '__main__':

host = ['10.0.0.10','10.0.0.11','10.0.0.12'] # 這裡模擬多ip位址的情況,也可以從檔案中讀取ip——list

q = queue.queue()

for ip in host:

q.put(ip)

threads =

for i in range(10):

t = threading.thread(target=check_open,args=(q,))

t.start()

for t in threads:

t.join()

這裡使用了queue,那麼就會引出生產者和消費者模型,生產者只需要把資訊存入到佇列中,消費者消費時只需要看佇列中有沒有,這樣極大程度了解耦了我們的程式。

posted @

2018-03-30 14:44

dahlhin 閱讀(

...)

編輯收藏

利用Python進行埠掃瞄

在linux中判斷一台主機是否可達,可以使用ping命令,而判斷埠是否開啟,可以使用telnet命令,但是telnet命令沒有超時時間的引數,使用起來不是很方便,那麼可以利用python來完成乙個埠掃瞄的功能 usr bin env python import socket def get ip s...

利用Python進行埠掃瞄

在linux中判斷一台主機是否可達,可以使用ping命令,而判斷埠是否開啟,可以使用telnet命令,但是telnet命令沒有超時時間的引數,使用起來不是很方便,那麼可以利用python來完成乙個埠掃瞄的功能 usr bin env python import socket def get ip s...

利用Python進行埠掃瞄

在linux中判斷一台主機是否可達,可以使用ping命令,而判斷埠是否開啟,可以使用telnet命令,但是telnet命令沒有超時時間的引數,使用起來不是很方便,那麼可以利用python來完成乙個埠掃瞄的功能 usr bin env python import socket def get ip s...