在linux中判斷一台主機是否可達,可以使用ping命令,而判斷埠是否開啟,可以使用telnet命令,但是telnet命令沒有超時時間的引數,使用起來不是很方便,那麼可以利用python來完成乙個埠掃瞄的功能
#!/usr/bin/env pythonimport 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
aserr:
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也可以完成埠檢測任務
importtelnetlib
defget_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
defget_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
defget_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()
defcheck_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,那麼就會引出生產者和消費者模型,生產者只需要把資訊存入到佇列中,消費者消費時只需要看佇列中有沒有,這樣極大程度了解耦了我們的程式。
利用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...