我用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/