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