簡體   English   中英

我的ping掃描程序無法正常工作。 我究竟做錯了什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM