python - 我的 ping 扫描程序无法运行。我究竟做错了什么?

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

最佳答案

据我所知,您的代码存在四个问题。

失败的 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,但至少在开发和调试它时,拥有此信息很有用。

幸运的是,添加很容易:在 break 之后添加以下行:

    else:
        print(addr, ' ---> Down')

(else 应与内部 for 对齐,根据需要自定义消息)。如果 for 循环没有中断,即没有包含 TTL 的行,则执行 else block 中的代码。

您正在 ping 太多地址

您的代码包含以下行

en1 += en1

其效果是使en1加倍。

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

关于python - 我的 ping 扫描程序无法运行。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53137344/

相关文章:

python-3.x - 如何在 python 中更改我的 Slack 机器人图标?

Python3.7 与 GNU/Linux 并使用 os.makedirs() - PermissionError : [Errno 13] Permission denied

python - 用于快速开发棋盘游戏动态编程解决方案的库

python - scipy 勒让德多项式中的正交性问题

python - 当 n 非常大时有效地计算 nCr mod p

javascript - 尝试从 javascript 中的 django 获取列表列表作为 csv 数据,但引号显示在 html 数字中

python - Django 1.10 不显示来自数据库的帖子

python - 为什么在python中编写确定 "machine precision"的程序时定义eps=1并除以2

python - Keras:向密集层添加一批常量输入

python - 如何舍入到特定的预定义数字?