假设局域网中有多台主机,只能开通ssh服务(端口22),如果发现其他服务打开,则全部关闭。通过运行一个shell脚本,完成以上功能。在实际运维中,可以通过puppet等工具更快更好的完成这个功能,所以本案例仅仅用来练手,为了熟悉sed, awk, grep等常见的shell命令而已。

1、通过nmap命令查询局域网中所有主机打开的端口,并存入文件nmap1.txt中。

 # 通过nmap命令查询局域网中所有主机打开的端口,并存入文件nmap1.txt中
mkdir -p /wuhao/sh/files
nmap $ > /wuhao/sh/files/nmap1.txt

以nmap 192.168.20.1-10为例,输出结果为:

Starting Nmap 5.51 ( http://nmap.org ) at 2016-03-03 16:37 CST
Nmap scan report for oos01 (192.168.20.1)
Host is up (.0000040s latency).
Not shown: closed ports
PORT STATE SERVICE
/tcp open ftp
/tcp open ssh
/tcp filtered http Nmap scan report for oos02 (192.168.20.2)
Host is up (.000099s latency).
Not shown: closed ports
PORT STATE SERVICE
/tcp open ssh
/tcp open http
/tcp open mysql
MAC Address: :1C::FF:5A:B5 (Parallels) Nmap scan report for oos03 (192.168.20.3)
Host is up (.000097s latency).
Not shown: closed ports
PORT STATE SERVICE
/tcp open ssh
/tcp open http
/tcp open mysql
MAC Address: :1C::::3C (Parallels) Nmap done: IP addresses ( hosts up) scanned in 1.57 seconds

2、从文件nmap1.txt中提取出需要的信息(主机ip,以及端口状态)。

 # 从文件nmap1.txt中提取出需要的信息(主机ip,以及端口状态)
sed -n '/\(Nmap scan report for\|^[0-9]\+\/\)/p' /wuhao/sh/files/nmap1.txt > /wuhao/sh/files/nmap2.txt
hosts=($(grep -on '(.*)' /wuhao/sh/files/nmap2.txt | sed -n 's/(\|)//gp'))
declare -i len=${#hosts[*]}
declare -i i=
while [[ $i -lt $len ]]
do
lines[$i]=$(echo ${hosts[$i]} | awk -F ':' '{print $1}')
ips[$i]=$(echo ${hosts[$i]} | awk -F ':' '{print $2}')
i=$i+
done
# echo ${lines[*]}=
# echo ${ips[*]}=192.168.20.1 192.168.20.2 192.168.20.3

3、在端口状态行首添加所对应的主机ip信息,并将结果保存到文件nmap2.txt中。

 # 在端口状态行首添加所对应的主机ip信息
declare -i j=
while [[ $j -lt $len ]]
do
declare -i k=$j+
if [ $j -ne $(($len-)) ]; then
sed -i "$((${lines[$j]}+1)),$((${lines[$k]}-1))s/^/${ips[$j]} /" /wuhao/sh/files/nmap2.txt
else
sed -i "$((${lines[$j]}+1)),$""s/^/${ips[$j]} /" /wuhao/sh/files/nmap2.txt
fi
j=$j+
done # 将多个空格以及/替换为一个空格
sed -i 's/ \+\|\// /g' /wuhao/sh/files/nmap2.txt

nmap2.txt文件内容为:

Nmap scan report for oos01 (192.168.20.1)
192.168.20.1 tcp open ftp
192.168.20.1 tcp open ssh
192.168.20.1 tcp filtered http
Nmap scan report for oos02 (192.168.20.2)
192.168.20.2 tcp open ssh
192.168.20.2 tcp open http
192.168.20.2 tcp open mysql
Nmap scan report for oos03 (192.168.20.3)
192.168.20.3 tcp open ssh
192.168.20.3 tcp open http
192.168.20.3 tcp open mysql

4、提取出需要关闭的端口(除了端口22之外,其余端口全部关闭)。通过sshpass远程登录到各主机,并且在iptables执行关闭端口命令。

 # 提取出需要关闭的端口(除了端口22之外,其余端口如果打开则全部关闭)
awk '{if($4~/open/ && $2!=22) print $0}' /wuhao/sh/files/nmap2.txt > /wuhao/sh/files/nmap3.txt hostip=($(awk -F " " '{print $1}' /wuhao/sh/files/nmap3.txt))
port=($(awk -F " " '{print $2}' /wuhao/sh/files/nmap3.txt))
protocol=($(awk -F " " '{print $3}' /wuhao/sh/files/nmap3.txt)) # 通过sshpass远程登录到各主机,并且在iptables执行关闭端口命令
for((m=;m<${#hostip[*]};m=m+))
do
sshpass -p 123456 ssh root@${hostip[$m]} "iptables -A INPUT -p ${protocol[$m]} --dport ${port[$m]} -j DROP;service iptables save;service iptables restart;exit"
done echo "success!"

5、运行脚本,查看结果。

[root@oos01 sh]# sh shutdownport.sh 192.168.20.1-
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
success!

linux shell实现批量关闭局域网中主机端口的更多相关文章

  1. Linux shell脚本 批量创建多个用户

    Linux shell脚本 批量创建多个用户 #!/bin/bash groupadd charlesgroup for username in charles1 charles2 charles3 ...

  2. 使用shell查看局域网中主机的IP地址

    此脚本只是快速查看所在局域网中其它主机的IP地址,如果对方设置了禁ping,则无法显示出此主机的IP地址: #!/bin/bash ` do ping -c2 .$i &>/dev/nu ...

  3. linux shell脚本:在脚本中实现读取键盘输入,根据输入判断下一步的分支

    echo please input “runbip” to run bip. variableName="null" while [ $variableName != " ...

  4. Linux - Shell - 在多个文件中查找关键字

    1. 概述 在多个文件中 查找内容 2. 想干啥 目的 在 多个文件 中, 查找内容 准备 之前在 单个文件里 查找过内容 工具 awk 前提 文件有固定格式 查找时有字段的要求 例子 # print ...

  5. linux安装后ping不通局域网其他主机的解决方式

    安装了linux后尝试进行机器间的相互通讯,发现自己虚拟机并不能查看ip地址,也不能够ping通任何一台局域网内的主机 上网查了一下发现是网卡并没有打开,需要进行如下配置 查看ls 一下/etc/sy ...

  6. Linux shell下批量创建缩略图

    一.背景 今天,突然发现手机客户端上的最新新闻缩略图都不显示了,上服务器上看了看, 发现新的新闻图片根本没有生成缩略图. 这套新闻发布系统是很老的程序了,查了一下,问题的原因是不支持png格式的图片, ...

  7. shell脚本批量配置多台主机静态ip

    关于脚本 服务器使用之前,都需要先配置静态IP,那就将这种简单重复的工作,交给脚本来处理吧,让我们运维有更多的时间喝茶看报刷微博 脚本使用 sh ssh.sh ip.txt ssh.sh 为脚本的名称 ...

  8. Linux Shell基础 多个命令中的分号(;)、与(&&) 、 或(||)

    概述 在 Bash 中,如果需要让多条命令按顺序执行,则有这样方法,如表 1 所示. 多命令执行符 格 式 作 用 : 命令1 ; 命令2 多条命令顺序执行,命令之间没有任何逻辑关系 &&am ...

  9. shell下批量除去文件名中的空格

    rename 's/ /_/g' * 上述命令可以将当前文件夹内所有文件的名字中得所有空格替换为_.其中g代表所有,如果不加g,如果文件名字中有多个空格,仅替换第一个.

随机推荐

  1. js 分页

    html代码:  <div id="paging_wrap" class="paging-wrap"></div> css代码: div ...

  2. 2019.01.26 codeforces 632E. Thief in a Shop(生成函数)

    传送门 题意简述:给nnn个物件,物件iii有一个权值aia_iai​,可以选任意多个.现在要求选出kkk个物件出来(允许重复)问最后得到的权值和的种类数. n,k,ai≤1000n,k,a_i\le ...

  3. Java核心技术之基础知识

    一.类型转换 数值类型之间的转换 强制类型转换 a)       将一个数值强制转换成另一种类型时,如果超出目标类型的便是范围,结果就会截断成一个完全不同的值.(如:(byte)300的实际值为44) ...

  4. boost-数据类型之auto、any、tuple、variant

    1.auto.decltype   auto是C++11中的关键字,它可以通过类型推导自动得到变量或对象的类型,需要注意的是auto会忽略引用,因为引用其实就代表原对象: #include <v ...

  5. spring mvc 文件上传工具类

    虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...

  6. 好文推荐系列---------(4)使用Yeoman自动构建Ember项目

    好文原文地址:http://segmentfault.com/a/1190000000368881 我决定学习前端开发的效率工具Yeoman.本文将首先介绍Yeoman的基本情况,接着我们会使用Yeo ...

  7. 基于MySQL自增ID字段增量扫描研究

    目录 目录 1 1. 问题 1 2. 背景 1 3. InnoDB表 2 3.1. 自增ID为主键 2 3.2. 自增ID为普通索引 4 3.3. 原因分析 7 4. MyISAM表 8 4.1. 自 ...

  8. C++遍历目录和文件夹

    我们需要一个结构体和几个函数.这些函数和结构体在<io.h>的头文件中,结构体为struct _finddata_t ,函数为_findfirst._findnext和_fineclose ...

  9. windows下解决numpy, scipy等库安装失败的方法

    如果pip安装scipy库失败,可以参考以下方法: scipy官方上提供了这样的方法: Windows packages Windows does not have any package manag ...

  10. C#-VS配置开发环境-摘

    配置开发环境   包含的开发环境 LightSwith LightSwitch 微软出品 web界面开发部署非常方便