在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...