我突然有一个用 Bash 来编写 TCP 端口扫描器的想法。Bash 支持可读写的特殊文件 /dev/tcp/host/port ,往这个文件写内容可以让 bash 打开一个 TCP 连接到 host:port ,如果写文件成功则表示此端口是打开的,否则说明该端口没有打开。
因此我们先简单的写一个测试脚本:
1 |
for port in {1..65535}; do
|
2 |
echo >/dev/tcp/google.com/$port &&
|
3 |
echo "port $port is open" ||
|
4 |
echo "port $port is closed"
|
该脚本将扫描 google.com 服务器端口,从 1 到 65535。当然,如果端口没打开的话是没法工作的,bash 花了 2 分钟时间意识到这点。
为了解决这个问题我们需要一些类似 alarm(2) 的方法来中断 bash,而 bash 没有内置的 alarm 函数,因此我们用 Perl 语言写了一个:
04 |
$SIG {ALRM} = sub { die };
|
这个 alarm 函数需要两个参数:alarm 调用的秒数和要执行的代码,如果执行的代码没有在指定的时间内执行完毕则该函数调用失败。
有了这个 alarm 函数,我们就可以修改上面的代码如下:
1 |
for port in {1..65535}; do
|
2 |
alarm 1 " echo >/dev/tcp/google.com/$port &&
|
3 |
echo \ "port $port is open\"" ||
|
4 |
echo "port $port is closed"
|
这个终于可以运行了,当扫描到某个端口是关闭的, bash 将在 1 秒后执行下一个端口的扫描。
然后我们将这些代码封装到一个 scan 函数中:
02 |
if [[ -z $1 || -z $2 ]]; then
|
03 |
echo "Usage: $0 <host> <port, ports, or port-range>"
|
11 |
IFS=- read start end <<< "$2"
|
12 |
for ((port=start; port <= end; port++)); do
|
17 |
IFS=, read -ra ports <<< "$2"
|
25 |
for port in "${ports[@]}" ; do
|
26 |
alarm 1 " echo >/dev/tcp/$host/$port &&
|
27 |
echo \ "port $port is open\"" ||
|
28 |
echo "port $port is closed"
|
这样就可以在 shell 中使用 scan 函数,需要的参数包括要扫描的主机地址、端口列表(可以时端口组合和端口范围,或者是某个特定端口)
下面是扫描 google.com 服务器的 78 - 82 端口:
1 |
$ scan google.com 78-82 |
如果你想测试 UDP 端口,只需要将前面提及的 /dev/tcp 改为 /dev/udp/
原文:http://www.oschina.net/question/12_67215
分享到:
相关推荐
bash脚本编写教程简易教 bash脚本编写教程简易教
用bash编写的命令行应用程序,可帮助您跟踪日常任务,待办事项,提醒
CDM(Console Display Manager)是一个新的登录管理器,它完全使用 Bash 编写,其特点是轻巧、快速,基于 Dialog,没有其他多余的依赖。CDM 包括多用户、多会话、主题支持等功能,可用来替代 GDM、KDM、SLiM、Qingy ...
用Bash编写漂亮的命令行程序
linux-torque一个用纯bash编写的transmissiondaemonTUI客户端
Bash脚本编写中遇到的问题 Bash脚本编写中遇到的问题
用bash编写的简单、快速文件管理器
一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂!
homeshick - 采用bash编写的git dotfiles同步器
这里有个老American写的 BASH脚本编写教程,非常不错,至少没接触过BASH的也能看懂!
简单的端口扫描 Bash 脚本使用 Nmap 自动执行某些类型的端口扫描的 Bash 脚本。 它包括一些扫描配置文件,用于识别常见的开放端口和服务、Web 服务器、UDP 服务、高端口、实时主机等,使用 TCP/SYN/UDP 和其他...
在《linux常用命令与高级Bash脚本编写指南(两个CHM)》中的压缩包忘记加上脚本源码了,对不起大家,可以从这里下载。上文地址: http://download.csdn.net/source/2270969 压缩包解开后可以找到上文中对应的全部bash...
pxltrm是用纯bash编写的终端像素艺术编辑器。 它允许您在不使用鼠标的情况下绘制像素图。
jinx✨是完全用Bash编写的nginx封装装脚本。 与使用普通shell命令相比,它可以更简化的方式帮助您管理站点和配置。
mulle-bootstrap用bash编写的C/C /ObjC的包管理器,跨平台的依赖管理器
Bash使用
采用Go编写的bash completion 命令行的bash completion。bash completion written in go bash completion for go command。
shell脚本编写基础,ExpectCourse.pdf,高级Bash脚本编程指南.pdf.chm及中英两本 毫无疑问,UNIX/Linux 最重要的软件之一就是 shell,目前最流行的 shell 被称为 Bash(Bourne Again Shell),几乎所有的 Linux 和绝大部分...
使用 Bash shell 脚本进行功能测试
一个漂亮的系统信息工具,用bash编写,用于android上的termux。 androfetch一个漂亮的系统信息工具,用bash编写,用于android上的termux。 注意:使用meslo nerd字体。 由Laraib07创建安装wget ...