有时,内部可能会出现网络或防火墙问题,需要进行网络扫描,以查找正在使用的IP地址。 为此,我们可以使用现成的工具,如nmap,zmap或angryIP。 但如果我们没有互联网访问下载这些工具,我们只能使用手动命令进行扫描。 但是,手动扫描可能是相当乏味的,应该对我们网络上给出的每个IP地址进行理解。
考虑到上述情况,我将在本教程中介绍我们如何使用Python自动执行此任务,知道python几乎可用于市场上可用的所有Linux发行版。
Python是完美的选择,因为它允许我们自动化操作系统可以执行的每个任务,我们只需要使用正确的库。
在Python中使用Linux库
我们目前研究的重点是ping扫描命令,用于检测网络上的所有连接和开机设备。 我们正在构建的脚本对网络上的每个IP地址进行ping。 例如,我们使用子网掩码/ 24,它将仅通过IP的前3个八位字节循环。 我们必须考虑的这个脚本的第一件事是哪个系统库可以用于任务,我们必须导入sys和子进程库。 这些库允许使用python解释器和操作系统本身的特定命令,在这种情况下是Scientific Linux 7.1。
import sys, subprocess
我将保存我的脚本名为networkmonitor.py。
检测正确的参数
当我们使用命令运行脚本时
>> python networkmonitor.py 10.0.0。
在shell上,如果命令的参数是错误的( 如果len(sys.argv )<> 2 :) ,则脚本将显示正确的示例。 ( 打印“networkmonitor.py 10.0.0” )。
参数是扫描子网的IP地址,仅使用前3个八位字节。 所以如果参数是正确的,那么命令“ping -c1”+ sys.argv [1]的结果将被存储在一个变量中,在我们的例子中是cmdping , sys.argv [1]是“参数”变量在sys模块中,将存储给脚本的第一个参数。 在UNIX环境中,我们必须使用ping -c1 ,因为ping命令将无限期运行。
if len(sys.argv)<>2:
print "networkmonitor 10.0.0."
子进程命令,其参数和for循环
在下一行启动for循环,执行直到达到我们设置的限制(停止条件)为止,条件是要扫描的IP范围。 此时,重要的是考虑脚本需要扫描范围的时间,脚本运行时间越长。 子进程.Popen允许我们启动一个shell命令并等待它完成。 一旦完成,我们检查命令返回的状态。 cmdping + str(x) ,由子进程执行。 Popen , 增加for循环每个循环上的参数给出的IP的索引。
shell = true表示该进程将在shell上执行。 然而,Python文档网站警告使用shell = true的危险,所以请小心执行哪个命令。 使用stderr参数的子进程PIPE表示Python将打开一个到标准流的管道。
for x in range(99,110):
p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
在这种情况下,我们只测试了11个IP地址(从99到110)。
现在我们要检查stderr的内容,当变量为空时,我们将停止(break),否则我们显示stdout 内容。
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
如果shell保持为真状态,则最后一个代码必须运行。
现在的完整代码是:
import sys, subprocess
if len(sys.argv)<>2:
print "networkmonitor 10.0.0."
else:
cmdping ="ping -c1 "+sys.argv[1]
for x in range(99,110):
p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
while True:
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
我们的小脚本的输出是:
如屏幕截图所示,该工具只能ping一个正或负的答案,然后移动到下一个IP地址,依此类推,以分析整个地址范围。
应该提到的是,我不要求上述分析代码的作者身份。 我只是逐步解释其功能,以更好地了解系统命令和网络功能。 我会给作者的信用。