背景
最近在研究一键部署,其中有一个环节,是要使用shell脚本放开防火墙的某个端口号
方法
使用shell中常见的插入文本命令:sed
问题
如果已经预知要打开的端口号如6379,可以使用:sed -i ‘10a\-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT‘ /etc/sysconfig/iptables 来实现
但是目前的端口号为未知变量$port,如果使用:sed -i ‘10a\-A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT‘ /etc/sysconfig/iptables的植方式来写入,在iptables中仍然显示的是变量名,而不是变量名的值
这是一个大坑大坑
找了很长时间的解决方法,比如加"",加\。。。。,都没有用
终于在今天,一举突破,感谢给我提供思路和解决方案的陌生人,喝水不忘挖井人:http://www.capjsj.cn/sed_variable.html
解决方式为:sed -i ‘10i-A INPUT -m state --state NEW -m tcp -p tcp --dport ‘$port‘ -j ACCEPT‘ /etc/sysconfig/iptables
授人以鱼不如授人以渔,产生问题的原因是:
因为 $port 是shell变量而不是sed中的变量,需要单独拿到 sed 的单引号外面来才能被 shell 解析。单引号里面是 sed 的势力范围,shell 无法触及。
sed的参数后的命令,是以单引号开始,单引号结束的,所以想将shell变量拿出来,那就在变量前面加个单引号让sed命令结束,再在变量后面再加个单引号让sed命令再开始
原文地址:https://www.cnblogs.com/jasmine095/p/11273374.html