介绍
在本实验中,你将学习如何使用 shell 脚本和 cron 调度来自动化 Nmap 扫描。本实验首先创建一个简单的 shell 脚本 scan.sh,其中包含一个针对 192.168.1.1 的 Nmap SYN 扫描命令。然后,你将使用 chmod +x scan.sh 使脚本可执行,并从终端运行它。
接着,本实验通过使用文本编辑器扩展脚本来包含多个扫描。最后,你将使用 cron 调度脚本自动运行,通过 crontab -e 进行配置,并在 Xfce 终端中验证自动执行情况。
使用 echo "nmap -sS 192.168.1.1" > scan.sh 创建扫描脚本
在这一步中,我们将创建一个简单的 shell 脚本,用于执行 Nmap 扫描。这个脚本将作为后续自动化更复杂扫描的基础。我们将使用 echo 命令把 Nmap 命令写入一个名为 scan.sh 的文件中。
首先,让我们了解一下 echo 的作用。echo 命令只是将其参数打印到标准输出。我们可以使用 > 运算符将这个输出重定向到一个文件。
我们要使用的 Nmap 命令是 nmap -sS 192.168.1.1。下面来分解一下这个命令:
nmap:这是运行 Nmap 扫描器的命令。-sS:这个选项指定了 SYN 扫描,这是一种扫描端口的隐蔽方式。它也被称为“半开放”扫描,因为它不会完成 TCP 握手。192.168.1.1:这是我们要扫描的目标 IP 地址。这是一个常见的私有 IP 地址,但你可能需要根据你的网络配置进行调整。
现在,让我们创建脚本。在 ~/project 目录中打开你的终端(如果你不在该目录下),并执行以下命令:
echo "nmap -sS 192.168.1.1" > scan.sh
这个命令将在你的 ~/project 目录中创建一个名为 scan.sh 的文件,并将 Nmap 命令写入其中。
要验证文件是否正确创建,你可以使用 cat 命令来显示其内容:
cat scan.sh
你应该会看到以下输出:
nmap -sS 192.168.1.1
这确认了脚本已使用正确的 Nmap 命令创建。
使用 chmod +x scan.sh 使脚本可执行
在这一步中,我们将使 scan.sh 脚本可执行。在 Linux 中,默认情况下新创建的文件没有执行权限。我们需要显式地授予此权限,以便能够运行该脚本。
chmod 命令用于更改文件或目录的权限。+x 选项为指定的文件添加执行权限。
在你的终端中,导航到 ~/project 目录(如果你不在该目录下)并执行以下命令:
chmod +x scan.sh
此命令将为 scan.sh 文件添加执行权限。
要验证脚本现在是否可执行,你可以使用 ls -l 命令列出文件的权限。
ls -l scan.sh
你应该会看到类似以下的输出:
-rwxr-xr-x 1 labex labex 25 Oct 26 10:00 scan.sh
-rwxr-xr-x 字符串中的 x 表示该文件现在是可执行的。具体来说,第一个 rwx 指的是所有者的权限(读、写、执行),第二个 r-x 指的是组的权限,第三个 r-x 指的是其他人的权限。
既然脚本已经可执行,我们可以在下一步中运行它。
使用 ./scan.sh 运行脚本
在这一步中,我们将执行在前几步中创建并使其可执行的 scan.sh 脚本。
要运行该脚本,我们使用 ./ 前缀。这会告诉 shell 执行位于当前目录中的脚本。
在你的终端中,确保你在 ~/project 目录中,并执行以下命令:
./scan.sh
你应该会在终端中看到 Nmap 的输出。输出会因目标主机(192.168.1.1)是否可达以及其上运行着哪些服务而有所不同。如果目标不可达,你可能会看到类似“主机似乎已关闭”的消息。如果目标可达,你会看到开放端口的列表以及有关目标的其他信息。
重要注意事项:192.168.1.1 这个 IP 地址是一个常见的默认网关地址。如果这不是你网络中某个设备的正确地址,扫描可能不会产生有用的结果。你可以将 192.168.1.1 替换为你想要扫描的网络中某个设备的 IP 地址。不过,要确保你有权限扫描该目标。未经授权扫描网络是非法且不道德的。
由于 nmap 的输出会因网络和目标的不同而有很大差异,我们无法直接可靠地验证输出。但是,我们可以通过检查命令历史记录来验证命令是否已执行。
在 Xfce 文本编辑器中向脚本添加多个扫描
在这一步中,我们将使用 Xfce 文本编辑器向我们的 scan.sh 脚本添加更多 Nmap 扫描命令。这样我们就可以通过单次执行脚本来执行多个扫描。
首先,在 Xfce 文本编辑器中打开 scan.sh 文件。你可以通过右键点击桌面,选择“在此处打开终端”,然后输入以下命令来做到这一点:
nano scan.sh
这将在 nano 文本编辑器中打开 scan.sh 文件。
目前,该脚本包含一行内容:
nmap -sS 192.168.1.1
让我们添加另一个扫描命令。例如,我们可以添加一个 ping 扫描(-sn)来检查另一个主机是否在线:
nmap -sS 192.168.1.1
nmap -sn 192.168.1.2
你可以根据需要添加任意数量的扫描命令。例如,让我们向第一个目标添加一个版本检测扫描(-sV):
nmap -sS -sV 192.168.1.1
nmap -sn 192.168.1.2
现在,该脚本将首先对 192.168.1.1 执行带有版本检测的 SYN 扫描,然后对 192.168.1.2 执行 ping 扫描。
重要注意事项:请记住将 192.168.1.1 和 192.168.1.2 替换为你想要扫描的网络中设备的 IP 地址,并确保你有权限扫描它们。
要保存更改,请按 Ctrl+X,然后按 Y 确认,再按 Enter 保存文件。
现在,当你使用 ./scan.sh 运行脚本时,它将执行你添加的所有 Nmap 命令。
使用 crontab -e 通过 cron 调度扫描
在这一步中,我们将使用 cron 安排我们的 scan.sh 脚本自动运行。cron 是类 Linux 操作系统中基于时间的任务调度器。它允许你安排命令或脚本在特定的时间、日期或间隔运行。
要使用 cron 安排任务,我们使用 crontab 命令。crontab -e 命令会在文本编辑器中打开 crontab 文件(在 LabEx 环境中通常是 nano)。
在你的终端中,输入以下命令:
crontab -e
如果这是你第一次使用 crontab,系统可能会提示你选择一个编辑器。通过选择相应的数字来选择 nano。
crontab 文件包含一系列 cron 任务,每个任务占一行。每行由六个字段组成:
分钟 小时 每月的日期 月份 每周的日期 命令
- 分钟:任务将运行的小时中的分钟数(0 - 59)。
- 小时:任务将运行的一天中的小时数(0 - 23)。
- 每月的日期:任务将运行的月份中的日期(1 - 31)。
- 月份:任务将运行的一年中的月份(1 - 12)。
- 每周的日期:任务将运行的一周中的日期(0 - 6,其中 0 是星期日)。
- 命令:要执行的命令。
例如,要每分钟运行一次 scan.sh 脚本,在 crontab 文件中添加以下行:
* * * * * /home/labex/project/scan.sh
这一行的意思是:
*:每分钟*:每小时*:每月的每一天*:每个月*:每周的每一天/home/labex/project/scan.sh:要执行的命令(我们脚本的完整路径)
重要提示:在实际场景中,每分钟运行扫描通常不是一个好主意,因为这可能会给网络和目标设备带来压力。在本实验中用于测试目的,每分钟运行一次是可以接受的。
要保存更改,按 Ctrl + X,然后按 Y 确认,再按 Enter 保存文件。
你应该会看到类似“crontab: installing new crontab”的消息。这意味着 cron 任务已成功安排。
Cron 任务通常在后台运行,不显示任何输出。要查看 scan.sh 脚本的输出,你可以将其重定向到一个文件。例如,要将输出重定向到你 ~/project 目录中名为 scan.log 的文件,你可以将 cron 任务条目修改如下:
* * * * * /home/labex/project/scan.sh > /home/labex/project/scan.log 2>&1
> /home/labex/project/scan.log 部分将标准输出重定向到 scan.log 文件,而 2>&1 将标准错误重定向到同一个文件。
在 Xfce 终端中验证自动化
在这一步中,我们将验证 scan.sh 脚本是否由 cron 自动执行。由于我们将脚本安排为每分钟运行一次,我们应该能看到其执行的证据。
如果你将脚本的输出重定向到了一个文件(例如 scan.log),你可以检查该文件的内容,看看脚本是否一直在运行。在你的终端中,输入以下命令:
tail /home/labex/project/scan.log
此命令将显示 scan.log 文件的最后几行。如果脚本运行正常,你应该会在文件中看到 Nmap 扫描的输出,并且每分钟都会更新。
如果你没有将输出重定向到文件,那么你就不会有 scan.log 文件。在这种情况下,你现在可以创建一个,并将 cron 任务的输出重定向到它。再次编辑 crontab:
crontab -e
并将 cron 任务条目更改为:
* * * * * /home/labex/project/scan.sh > /home/labex/project/scan.log 2>&1
保存 crontab 文件。然后,等待一两分钟,再次使用 tail /home/labex/project/scan.log 检查 scan.log 文件。
如果你仍然没有看到任何输出,脚本或 cron 任务可能存在问题。请仔细检查以下几点:
- 确保
scan.sh脚本是可执行的(chmod +x scan.sh)。 - 确保 crontab 文件中的 cron 任务条目正确(使用
crontab -l列出 cron 任务)。 - 确保 cron 任务条目中使用了脚本的完整路径(
/home/labex/project/scan.sh)。 - 检查脚本本身是否有任何错误。
重要提示:由于 cron 任务每分钟运行一次,scan.log 文件会快速增长。在验证它正常工作后,你可能想要删除 cron 任务,以避免占用磁盘空间。你可以通过编辑 crontab 文件(crontab -e)并删除你添加的行来删除 cron 任务。
总结
在本实验中,我们学习了如何使用 shell 脚本和 cron 实现 Nmap 扫描自动化。首先,我们创建了一个名为 scan.sh 的简单 shell 脚本,其中包含针对特定 IP 地址的 Nmap SYN 扫描命令。然后,我们使用 chmod +x scan.sh 使脚本可执行,从而能够直接从终端运行它。
接下来,我们使用文本编辑器扩展了脚本,以包含多个扫描。最后,我们使用 cron 安排脚本自动运行,通过 crontab -e 配置了一个 cron 任务,并在 Xfce 终端中验证了自动化。这展示了如何为定期监控或安全评估自动化网络扫描任务。



