Bash 脚本

Bash(Bourne Again Shell)是一种 Linux shell 和命令/编码语言。它是大多数 Linux 发行版的默认 shell。其他还有Z shell(zsh)、Bourne Shell(sh)、C Shell(csh)等。

Linux 外壳:

shell 是命令行中的解释程序,可用于向操作系统发送命令。它可以被认为是操作系统的交互接口,也是内核的最外层。

它允许用户和/或程序向操作系统及其低级实用程序发送消息和信号。



-Phoenix Nap:8 种 Linux Shell

Ping 扫频:

“ping 扫描器”是一个脚本,它将 ping 设备以查看其是否已连接/活动并返回结果。

因为 ping (在 Linux 上)会连续 ping,所以您可以使用 -c <number> 告诉它仅 ping <number> 次(-c 代表 count)。可以使用 >>> 将来自 ping 的响应附加到文件中。

使用 grep:

grep 是一个 Linux CLI 工具,允许您搜索文件或程序(Linux 中的所有内容都是文件)的输出以查找特定/唯一的字符串。在 ping 扫描器中,我们可以使用 grep 来过滤来自多个 ping 的响应,以仅包含成功的 ping。

因为成功的 ping 将输出一个包含 ping 响应中字节数的字符串,所以我们可以将 ping 的输出通过管道 (|) 传送到 grep ,并要求 grep 过滤掉包含子字符串“64 bytes”的所有响应。

1
2
3
ping 69.69.69.69 -c 1 > response.txt
cat response.txt | grep "64 bytes from"
64 bytes from 69.69.69.69: icmp_seq=1 ttl=56 time=24.2 ms

使用 cut

然后,您可以通过管道传输到 cut -d " " -f 4 (cut on space, get field 3) 以获取响应 ping 的 IP 地址。

1
2
ping 69.69.69.69 -c 1| grep "64 bytes from" | cut -d " " -f 4
69.69.69.69:

使用 tr (翻译)

由于输出上仍然留有冒号,因此我们可以使用 tr (translate) 命令对其进行进一步修饰,以去掉 :

1
2
ping 69.69.69.69 -c 1| grep "64 bytes from" | cut -d " " -f 4 | tr -d ":"
69.69.69.69

构建一个 Ping Sweeper

我们刚刚使用的命令可以通过将它们提取到 bash 脚本中来自动化:

1.文本编辑器

打开 nano 并将以下行放在顶部:

1
#!/bin/bash

这称为“shebang”,它告诉编译器/机器以下脚本位于 bash 中,并且这是 bash 在文件系统中的位置。

2. 从命令行粘贴代码

1
ping 69.69.69.69 -c 1| grep "64 bytes from" | cut -d " " -f 4 | tr -d ":"

将这样的代码粘贴到 bash 脚本中就可以了,调用该脚本将运行命令,就像在终端中运行它们一样。但是,您想要检查 子网 内的多个 IP 地址。要运行此命令足够多次,您需要创建一个 for 循环。

3.Bash for 循环

编码中的 for 循环允许表达式运行多次,直到满足特定条件。对于 ping 扫描器,我们假设我们正在 ping 带有 /24 子网的 IP 地址,这意味着总共有 256 个地址。

因此,for 循环需要运行 254 次(对于网络和广播地址为 -2)才能覆盖整个子网。大多数 for 循环都是用布尔条件编写的,该条件决定循环何时停止执行其中的代码。对于这个 for 循环,我们的条件基本上是“对于从 1 到 254 之间的每个 true(存在)的数字,执行此代码。”

1
2
3
4
5
#!/bin/bash

for ip in `seq 1 254`; do
ping 69.69.69.$ip -c 1| grep "64 bytes from" | cut -d " " -f 4 | tr -d ":" &
done

ip$ip 视为占位符变量,在 for 循环的每个循环中,它们将包含 1 到 254 之间的当前数字。 seq 1 254 是“起始数字 1 和结束数字 254 之间的序列”,两个数字都包含在内。

&(与符号)将允许 for 循环的每个周期作为单独的进程同时运行,这将使运行速度更快(但也需要更多资源/内存)。

4. 提供/处理参数

在 Bash(以及其他编码语言/脚本等)中,给予脚本的第一个参数始终是其本身。随后的参数是调用脚本时在命令行中赋予脚本的参数。

1
2
3
./ping_sweep.sh 69.69.69.69
# ./ping_sweep.sh is arg 1 ($0)
# 69.69.69.69 is arg 2 ($1)

要使用 bash 引用脚本中的参数,请使用 $ 和参数的编号。因此第一个参数(脚本本身)是 $0,第二个参数是 $1。我们可以在脚本中使用参数,这样我们就可以给我们的程序一个起始 IP 地址:

1
2
3
4
5
#!/bin/bash

for ip in `seq 1 254`; do
ping -c 1 $1.$ip | grep "64 bytes" | cut -d " " -f 4 | tr -d ":" &
done

所以现在我们可以通过从命令行调用我们的脚本来扫描特定的地址空间,如 69.69.69 ,如下所示:

1
./ping_sweep.sh 69.69.69

5. If 语句

按原样运行此代码可能会出现错误,特别是如果我们运行它*而不给它任何参数。*添加 if 语句可以轻松解决此问题:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

if [ "$1" == "" ]
then
echo "Please specifiy an IP Address."
echo "Syntax: ./ping_sweep.sh xxx.xxx.xxx"
else
for ip in `seq 1 254`; do
ping -c 1 $1.$ip | grep "64 bytes" | cut -d " " -f 4 | tr -d ":" &
done
fi

6. 创建文件

现在,脚本正在输出到命令行,但除此之外不会保存信息。我们应该添加到我们的脚本中,以便它创建一个 IP 地址列表,然后我们可以使用该列表进行其他扫描,例如 nmap

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

if [ "$1" == "" ]
then
echo "Please specifiy an IP Address."
echo "Syntax: ./ping_sweep.sh xxx.xxx.xxx"
else
for ip in `seq 1 254`; do
ping -c 1 $1.$ip | grep "64 bytes" | cut -d " " -f 4 | tr -d ":" >> ip_list.txt &
done
fi

现在我们可以在 CLI 中使用如下命令在列表上运行 nmap:

1
for ip in $(cat ip_list.txt); do nmap $ip; done

美化 Ping Sweeper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

if [ "$1" == "" ]
then
echo "Please specifiy an IP Address."
echo "Syntax: ./ping_sweep.sh xxx.xxx.xxx"
else
for ip in `seq 1 254`; do
ping -c 1 $1.$ip | grep "64 bytes" | cut -d " " -f 4 | tr -d ":" >> ip_list.txt &
done
fi

for ping in $(cat ip_list.txt); do
nmap $ping
done

[!资源]

[!我以前的笔记(在文本中链接)]