我们在进行服务器配置的时候,经常要查看服务器的某个端口是否已经开放。如果服务器只有一两台的话,那很好办,只需要使用 nc 命令一个个查看即可。

但是,如果你的服务器是个集群,有很多台呢?那如果还一个个手动去检查的话,效率肯定是无比低下的,年底裁员名单里肯定有你。

在这种情况下,我们完全可以使用 Shell 脚本配合 nc 命令来达到我们的目的。而且,不管服务器有几台,需要检查的端口有几个,都可以实现这样的目标。

在本文里,我们用 Shell 脚本来实现两个需求:

  • 扫描多台服务器的一个端口是否打开
  • 扫描多台服务器的多个端口是否打开

在开始之前,我们先来了解一下 nc 命令。

nc 命令简介

nc 是英文单词 netcat 的缩写,它是通过使用 TCP 或 UDP 的网络协议的连接来读或写数据,可以直接被第三方程序或脚本直接调用。

同时,它是一款功能非常强大的网络调试工具,因为它可以创建几乎所有你所需要的连接方式。

nc 工具主要有三种功能模式:连接模式、监听模式、通道模式。它的一般使用格式如下:

$ nc [-options] [HostName or IP] [PortNumber]

接下来,我们就用 Shell 脚本结合 nc 命令来实现我们的两个需求。

1. 扫描多台服务器的一个端口是否打开

在这里,我们先把需要查询的所有服务器地址全部放在一个 server-list.txt 文件里,每个地址单独一行,如下:

# cat server-list.txt
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7

然后,我们再用 for 循环依次扫描 server-list.txt 里对应服务器的端口是否打开。在这里,我们扫描 22 端口是否打开。

# vi port_scan.sh

#!/bin/sh
for server in `more server-list.txt`
do
#echo $i
nc -zvw3 $server 22
done

最后,我们给这个脚本赋予可执行权限即可。

$ chmod +x port_scan.sh

之后,我们就可以用这个脚本来自动依次检查多个服务器的 22 端口是否已打开。

# sh port_scan.sh

Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.5 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.6 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.7 22 port [tcp/ssh] succeeded!

2. 扫描多台服务器的多个端口是否打开

在这里,我们同样把需要查询的所有服务器地址全部放在一个 server-list.txt 文件里,每个地址单独一行。这里就不重复演示了。

与此同时,我们也把需要查询的服务器端口放在另一个 port-list.txt 文件里,每个端口单独一行,如下所示:

# cat port-list.txt
22
80

然后,我们再用 for 循环依次扫描 server-list.txt 里对应服务器 port-list.txt 所列的端口是否打开。注意,这里用到了两个 for 循环,第一层是服务器列表,第二层是端口列表。

# vi multiple_port_scan.sh

#!/bin/sh
for server in `more server-list.txt`
do
for port in `more port-list.txt`
do
#echo $server
nc -zvw3 $server $port
echo ""
done
done

最后,我们给这个脚本赋予可执行权限即可。

$ chmod +x multiple_port_scan.sh

之后,我们就可以用这个脚本来自动依次检查多个服务器的多个端口是否已打开。

# sh multiple_port_scan.sh
Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.2 80 port [tcp/http] succeeded! Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 80 port [tcp/http] succeeded! Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 80 port [tcp/http] succeeded! Connection to 192.168.1.5 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.5 80 port [tcp/http] succeeded! Connection to 192.168.1.6 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.6 80 port [tcp/http] succeeded! Connection to 192.168.1.7 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.7 80 port [tcp/http] succeeded!

公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

如何使用 Shell 脚本来查看多个服务器的端口是否打开?的更多相关文章

  1. shell脚本 批量查看mysql表条目数

    一.简介 源码地址 日期:2018/4/12 介绍:查看mysql的信息,用于比对和查询条目数 效果图: 二.使用 适用:centos6+ 语言:中文 注意:适用于5.7版本,其它版本要更改变量han ...

  2. bash shell脚本之查看系统环境变量

    查看当前系统环境变量 cat test2: #!/bin/bash # display user information from the system. echo "User info f ...

  3. bash shell脚本之查看当前日期以及登陆用户

    查看当前日期以及登陆用户: cat test1: #!/bin/bash # This script displays the date and who's logged on echo -n The ...

  4. Shell脚本快速查看网段内ip占用情况和可用ip

    思想就是整个网段ping一遍,对于ping不通的,解析其失败的字符来判定 #!/bin/bash head_add=${} address=${head_add%.*} echo address=$a ...

  5. history 查看历史操作记录在shell脚本执行中无法显示问题

    今天使用shell脚本想查看历史操作命令的记录于是写了一个再简单不过的脚本,可是以chmod +x 权限执行./test.sh发现执行后没有任何反应.于是查找原因:将脚本文件中的#!/bin/bash ...

  6. Linux如何编写自启动shell脚本

    1.需求分析 在很多情况下,程序员都做着重复枯燥的工作,虽然这些工作也是必须的,其实这些重复性的工作可以执行脚本替代:今天笔者就如何编写自启动shell脚本减少程序员开启服务器后的环境开启工作: 2. ...

  7. Shell脚本编程(二):shell变量

    定义变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程 ...

  8. 向大家分享一个shell脚本的坑

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  9. SQL Server 中执行Shell脚本计算本地文件的内容大小

    SQL Server 数据库中除了能执行基本的SQL语句外,也可以执行Shell脚本.默认安装后,SQL中的Shell脚本的功能是关闭的,需要手动打开, 执行以下脚本即可打开该功能. -- 允许配置高 ...

随机推荐

  1. Node.js NPM Tutorial: Create, Publish, Extend & Manage

    A module in Node.js is a logical encapsulation of code in a single unit. It's always a good programm ...

  2. Golang源码学习:调度逻辑(一)初始化

    本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...

  3. Kafka SSL安装与配置

    1.概述 最近有同学咨询说,Kafka的SSL安全认证如何安装与使用?今天笔者将通过以下几个方面来介绍Kafka的SSL: Kafka 权限介绍 Kafka SSL的安装与使用 Kafka Eagle ...

  4. byte值的问题

    byte值的问题 byte b1 = 127; byte b2 = (byte)128; //-128 byte b3 = (byte)129; //-127 byte b4 = (byte)130; ...

  5. Spring基础之IOC

    一.ioc能解决什么问题 1.Spring是什么 spring是以ioc和aop为核心,能整合第三方框架和类库的企业级应用开源框架. 2.程序的耦合问题 例子:Driver类必须存在,编译才通过,Jd ...

  6. secureCRT连接liunx(centos6.5)系统步骤以及碰见的问题

    1.首先安装secureCRT以及用vmware安装centos6.5系统,用vmware打开centos6.5系统 2.找到liunx系统的ip,在liunx终端用ifconfig找到ip如下图: ...

  7. cors跨越深度刨析

    解决跨域的方式JSOP,和CORS JSONP不做介绍了. CORS跨域: 参考阮一峰http://www.ruanyifeng.com/blog/2016/04/cors.html 官方:https ...

  8. 【Java8新特性】关于Java8中的日期时间API,你需要掌握这些!!

    写在前面 Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等.这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大.立志 ...

  9. Chisel3 - 复合数据类型

    https://mp.weixin.qq.com/s/rXYqiZKuBpAYL8R94zxgRA   Chisel允许用户根据需要,把基本数据类型组合成为复合数据类型使用.如C语言里面的结构体,这样 ...

  10. [leetcode] 动态规划(Ⅰ)

    这次按通过率从高到低刷题. 本文完成的题目:{338, 1025, 303, 121, 53, 392, 70, 746, 198} ,带有「面试」Tag 的题目:Interview - {1617, ...