[英]My ping sweep program is not working. What am I doing wrong?
我已經在Python3中編寫了一個ping掃描程序。
import os
import platform
from datetime import datetime
net = input('Enter the network address: ')
net1 = net.split('.')
a = '.'
net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input('Enter the starting number: '))
en1 = int(input('Enter the last number: '))
en1 += en1
oper = platform.system()
if(oper == 'Windows'):
ping1 = 'ping -n 1 '
elif(oper == 'Linux'):
ping1 = 'ping -c 1 '
else:
ping1 = 'ping -c 1 '
starttime = datetime.now()
print('Scanning in process...')
for ip in range(st1, en1):
addr = net2 + str(ip)
command = ping1 + addr
response = os.popen(command)
for line in response.readlines():
if (line.count('TTL')):
print(addr, ' ---> Live')
break
endtime = datetime.now()
totaltime = endtime-starttime
print('Scanning was completed in ', totaltime)
每當我輸入所需的輸入內容時,它只會打印出“正在掃描中”,並保持這種狀態,直到退出程序為止。 我在Linux Mint上的命令行中使用此代碼,我的代碼有什么問題?
如我所見,您的代碼有四個問題。
失敗的Ping需要太長時間才能失敗
在我的Linux系統(openSuSE)上,默認情況下ping超時為10秒。 在Windows上是5秒。 您的代碼可能沒有掛起,只是花費大量時間等待ping超時。
您可以通過使用命令行參數-W
指定超時(以秒為單位)來更改Linux ping實用程序的超時。 請注意,超時必須是整數秒; 超時(例如0.5
將被解釋為0
,而ping似乎將永遠等待。 在Windows上,您可以使用-w
參數指定超時時間,但是超時期限以毫秒為單位,而Linux則以秒為單位。
成功的Ping不被報告為成功
以下是成功ping的輸出:
$ ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.046 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms
仔細查看此輸出以及用於檢查目標IP地址是否可用的代碼。 注意到什么了嗎?
您要檢查的地址是否在if (line.count('TTL')):
,換句話說,您需要在輸出的一行中包含TTL
。 上面的輸出中沒有任何行包含TTL
,因此您的代碼認為這是失敗的。
您可能想要檢查不區分大小寫出現的字符串TTL
。 輸出不包含TTL
但確實包含ttl
。 因此,嘗試將if (line.count('TTL')):
更改為if (line.upper().count('TTL')):
Ping失敗不會被報告為失敗
您的代碼會打印出ping是否成功,但是如果ping不成功,則不會打印任何內容。 我很感激,一旦您使該腳本正常工作,您可能不需要它來打印失敗的ping,但是至少在開發和調試時,擁有此信息很有用。
幸運的是,添加起來很容易: break
之后添加以下幾行:
else:
print(addr, ' ---> Down')
( else
應與for
的內部對齊,根據需要自定義消息)。 如果for
循環沒有中斷,則else
塊中的代碼將執行,即沒有包含TTL
。
您正在ping太多地址
您的代碼包含以下行
en1 += en1
效果是使en1
倍增。
您可能打算寫en1 += 1
,以便結束地址包含for ip in range(st1, en1):
循環for ip in range(st1, en1):
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.