# 這個指令碼是實現linux中traceroute程式的,是探測從我們這個機器到我們要探測的ip位址中間都需要經過那些路由。# 原理:我們的機器傳送udp高階口的資料報,傳送給目的位址,首先設定ttl為1,然後逐次增加,在沒有到達我們的目的ip
# 位址的路由,會傳送icmp的超時報文,然後我們從中提取ip位址,因為我們傳送的是高階口的報文,到達目的位址的時候,
# 目的位址會傳送icmp的埠不可達報文,這樣我們就探測出從我們源埠到目的埠的路由。
from scapy.all import *
import struct,re,random
# 跟我們實現ping程式的想法是一樣的,首先構造乙個傳送乙個udp報文的函式,
# 入參為目的位址,ttl數。
def traceroute_one(dst,ttl_no,dport):
# 定義發包時間。
send_time = time.time()
try:
# 傳送乙個包,接收乙個包。
traceroute_one_reply = sr1(ip(dst=dst, ttl=ttl_no) / udp(dport=dport) / b'hello world', timeout=1,
verbose=false)
# 判斷icmp包是不是超時回答。
if traceroute_one_reply.getlayer(icmp).type == 11 and traceroute_one_reply.getlayer(icmp).code == 0:
# 提取源位址
src_ip = traceroute_one_reply.getlayer(ip).src
# 定義接收時間。
recv_time = time.time()
# 計算時間ms數
mid_time = (recv_time - send_time) * 1000
# 返回。
return 1,src_ip,mid_time
# 這裡接接收的是最後一跳。icmp應該是埠不可達。
elif traceroute_one_reply.getlayer(icmp).type == 3 and traceroute_one_reply.getlayer(icmp).code == 3:
# 下邊處理是一樣的。
src_ip = traceroute_one_reply.getlayer(ip).src
recv_time = time.time()
mid_time = (recv_time - send_time) * 1000
return 2, src_ip, mid_time
except exception as e:
return none
def traceroute(dst,hops):
# 目的埠從33434開始算起,入參為目的位址,我們想要查詢的路由的條數。
dport = 33434
hop = 0
# 進行迴圈包。
while hop < hops:
hop += 1
# 這裡需要改變埠。
dport += hop
# 傳送乙個包,獲取返回值。
traceroute_result = traceroute_one(dst,hop,dport)
# 如果出現了錯誤,列印*號。
if traceroute_result == none:
print('*')
# 這裡代表中間路由,我們進行列印資訊。
elif traceroute_result[0] == 1:
print("%d %s %4.2fms" % (hop,traceroute_result[1],traceroute_result[2]))
# 最後乙個包,為埠不可達,列印資訊後,需要退出迴圈,因為已經到達目的位址了,雖然可能沒有達到我們定義的條數。
elif traceroute_result[0] == 2:
print("%d %s %4.2fms" % (hop, traceroute_result[1], traceroute_result[2]))
break
time.sleep(1)
if __name__ == "__main__":
traceroute('180.101.49.12',10)
# 接下來我們就可以使用wirshark進行抓包來看一下。
07 Python小節案例
採集乙個人的身高,體重,年齡和性別 告訴ta,自己的體脂率是否在正常範圍之內 1.知識考察點 注釋 輸入輸出 變數使用 變數的命名規範 運算子的使用 資料型別轉換 2.體脂率計算公式 bmi 體重 kg 身高 身高 公尺 體脂率 1.2 bmi 0.23 年齡 5.4 10.8 性別 男 1 女 0...
07 Python函式基礎
1.函式簡介 2.函式引數 3.函式作用域 4.遞迴函式 5.高階函式1.函式簡介 1.1 函式分類 語法 deffunname parm1,parm2.expresssions 2.函式引數 2.1 形參與實參 2.2 引數傳遞方式 def f1 name,age print name name,...
07 Python 條件判斷與迴圈
1 if.else a 10 if a 10 print a大於等於10 else print a小於等於10 2if.elseif.else age 22 if age 18 print 成年了 elif age 16 print 半成年 else print 未成年 2.1 for 迴圈user...