利用sed命令,编写ip限制脚本

前言

公司项目已经处于试运行阶段,项目有安全需求,只能部分指定人员可以访问项目地址。考虑到管控方便,这里是通过nginx的ip限制实现该需求。

问题

nginx可以配置ip,指定的ip访问项目。其配置如图

 location / {
allow 133.129.174.99;
deny all;
}

该配置表示只允许 133.129.174.99 可以访问项目。其他ip均返回403

由于试运行阶段,访问系统的人员存在变动,每次增加或者减少ip限制,都需要去修改nginx的配置文件。然后重启nginx。
另外存在多个项目均需要执行相同的限制。依次修改,相当繁琐。而且容易操作失误。
因此期望编写一个脚本,来完成该工作。提供效率。

解决过程

1、确定脚本的名词、选项、参数。
脚本名称 设置为 allowIp.sh
选项有 -add 和-delete 分别表示增加ip和移除ip
支持缩写-a 代表 -add 、-d 代表-delete
参数则就是 ip地址。
2、编写脚本。

该版本在centos7正常运行。

#!/bin/bash
#添加ip到nginx配置中。确保可以访问。
#-add 表示增加 -a
#-delete 表示减去 -d
#

#$1表示获取脚本的第一个参数。 -n 表示是否为空
while [[ -n "$1" ]]; do
    case "$1" in
        -a | -add ) 
            param="$2"
            echo "allow ip  $param"
            #先删除再添加。避免出现同ip有2条配置。
            sed -i  '/^allow.*'$param';$/d' 'test.cnf'
            sed -i  's/deny all;/allow '$param';\n&/' 'test.cnf'
            #移动参数。每执行1次,则位于第一个参数的被删除。
            shift;;
        -d | -delete) 
            param="$2"
            echo "delete ip $param"
            #删除指定的ip配置。
            sed -i   '/^allow.*'$param';$/d' 'test.cnf'
            shift;;
        --) shift
            break ;;
        #输入的选项不存在。
        *)
            echo "$1 is not an option";;
    esac
    shift
done

# #重启nginx 。我的nginx是位于容器,重启容器需要root权限。
# echo "root密码"|sudo -S docker restart ngxing容器的名字

  • 测试脚本。

测试配置文件test.cnf如下。

    location / {
        root   /www;
        index  index.html index.htm;
allow 143.139.174.99;
deny all;
}

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

将2个文件放在同一目录下。
allowIp.sh 和 test.cnf
赋予allowIp.sh可执行权限。

chmod +x allowIp.sh 

然后运行

./allowIp.sh -a 127.0.0.1 -d 143.139.174.99 

再检查test.cnf即可发现文件被改变。

遇到的坑

该问题只出现在mac环境下。由于我使用mac编写脚本,在本地测试的时候,遇到一些问题。

  • 该脚本在mac上执行时报错:sed: 1: "test.cnf": undefined label 'est.cnf'
    解决方案:增加一个备份的追加名,例如.bak
    【sed -i '.bak' '/^allow.'param';/d' 'test.cnf'】
    原因:mac强制要求备份,否则报错。
    如果不想产生备份。可以置空。
    【sed -i '' '/^allow.
    'param';/d' 'test.cnf'】
  • 该脚本在mac上执行后,所添加的ip没有换行。
    解决方案:替换\n 为 '$\n
    原因: mac上的sed版本是BSD版本。而linux的sed是GNU版本。二者对换行的定义不同。

可以通过如下命令查看版本

man  sed 
//或者
sed --version
image.png
image.png

最终在mac上可执行的版本如下:

#!/bin/bash
#添加ip到nginx配置中。确保可以访问。
#-add 表示增加 -a
#-delete 表示减去 -d
#

#$1表示获取脚本的第一个参数。 -n 表示是否为空
while [[ -n "$1" ]]; do
    case "$1" in
        -a | -add ) 
            param="$2"
            echo "allow ip  $param"
            #先删除再添加。避免出现同ip有2条配置。
            sed -i '.bak' '/^allow.*'$param';$/d' 'test.cnf'
            sed -i '.bak' 's/deny all;/allow '$param';\'$'\n&/' 'test.cnf'
            #移动参数。每执行1次,则位于第一个参数的被删除。
            shift;;
        -d | -delete) 
            param="$2"
            echo "delete ip $param"
            #删除指定的ip配置。
            sed -i '.bak' '/^allow.*'$param';$/d' 'test.cnf'
            shift;;
        --) shift
            break ;;
        #输入的选项不存在。
        *)
            echo "$1 is not an option";;
    esac
    shift
done

# #重启nginx 。我的nginx是位于容器,重启容器需要root权限。
# echo "root密码"|sudo -S docker restart ngxing容器的名字

批量修改nginx配置文件。

上面只是对一个文件进行了操作。实际项目中,我配置了多个项目。均需要相同的ip限制。
因此多个文件批量修改只需要替换
'test.cnf' 修改为 'xxx目录下/*.cnf'
这里记得使用绝对路径。相对路径的话,如果你移动了脚本的位置则会出现找不到文件的情况。

最后

当前的脚本只能在所在目录执行。切换到其他目录无法执行。
这里可以修改环境变量path实现任意位置执行编写的脚本。

通过修改.bashrc文件:

vim ~/.bashrc 

//在最后一行添上:
export PATH=你的脚本存储目录:$PATH
生效方法:(有以下两种)
1、关闭当前终端窗口,重新打开一个新终端窗口就能生效
2、输入“source ~/.bashrc”命令,立即生效
有效期限:永久有效
用户局限:仅对当前用户

此时就可以随意目录下执行你编写的脚本了。

allowIp.sh -d 11 -a 22 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容