我的ping扫描程序无法正常工作。我究竟做错了什么?

时间:2018-11-04 02:51:11

标签: python python-3.x

我已经用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上的命令行上使用它,我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

如我所见,您的代码有四个问题。

失败的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对齐,根据需要自定义消息)。如果else循环没有中断,即没有行包含for,则TTL块中的代码将执行。

您要查验太多地址

您的代码包含该行

en1 += en1

具有使en1翻倍的效果。

您可能打算写en1 += 1,以便将结束地址包含在循环for ip in range(st1, en1):中。