了解如何使用 Scientific Linux 7.1 和 Python 检测网络设备
在此页
- 在 Python 中使用 Linux 库
- 检测正确的论点
- 循环
有时您可能在内部遇到网络或防火墙问题,需要进行网络扫描以查找正在使用的 IP 地址。为此,我们可以使用现成的工具,例如 nmap、zmap 或 angryIP。但是,如果我们无法访问互联网来下载这些工具,我们只能使用手动命令进行扫描。然而,手动扫描可能会非常乏味,因为应该对我们网络上给定的每个 IP 地址进行扫描。
考虑到上述情况,我将在本教程中展示我们如何使用 Python 自动执行此任务,因为市场上几乎所有 Linux 发行版都提供 Python。
Python 是完美的选择,因为它允许我们自动执行操作系统可以执行的每项任务,我们只需要使用正确的库。
在 Python 中使用 Linux 库
我们当前研究的重点是 ping sweep 命令,用于检测我们网络上所有连接和开启的设备。我们正在构建的脚本对网络上的每个 IP 地址进行 ping。例如我们使用子网掩码/24,它将只循环通过 IP 的前 3 个八位字节。对于这个脚本,我们首先要考虑的是哪些系统库可以用于该任务,我们必须导入 sys 和 subprocess 库。这些库允许使用 python 解释器和操作系统本身的特定命令,在本例中为 Scientific Linux 7.1。
import sys, subprocess
我将我的脚本保存在名称 networkmonitor.py 下。
检测正确的论点
当我们使用命令运行脚本时
>>蟒蛇网络监控.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] 是\argument\ sys 模块中的变量,并将存储提供给脚本的第一个参数。在 UNIX 环境中,我们必须使用 ping -c1,因为 ping 命令会无限运行。
if len(sys.argv)<>2:
print "networkmonitor 10.0.0."
子进程命令、它的参数和 for 循环
下一行开始for循环,一直执行到达到我们为它设置的限制(停止条件),条件就是我们要扫描的IP范围。此时,重要的是要考虑脚本扫描范围所需的时间,范围越大脚本运行的时间越长。 subprocess.Popen 允许我们启动 shell 命令并等待它完成。完成后,我们检查命令返回的状态。 cmdping+str(x),由子进程执行。
shell=true 表示进程将在 shell 上执行。但是,Python 文档网站警告使用 shell=true 的危险,因此请小心执行哪个命令。 subprocess.PIPE using as stderr 参数表示 Python 应打开一个到标准流的管道。
for x in range(99,110):
p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
在这种情况下,我们只测试了 11 个 IP 地址(从 99 到 110)。
现在我们必须检查 stderr 的内容,当变量为空时我们将停止(中断),否则我们将显示 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 地址,依此类推以分析整个地址范围。
应该指出的是,我不声称是上述分析代码的作者。我只是一步一步地解释它的功能,以便更好地理解系统命令和网络功能。我要感谢作者。