上一篇:20070211- 一位母亲(2019-07-14 22:10:39)
文章大纲

PHP exec方法调用sed命令实现iptables的增删改

2019-07-21 17:54:53

业务场景:

服务器A、B、C、D...需要读取中央服务器W上里redis里的数据。


需求提出:

每来一台新服务器X,就需要在W上手动编辑iptables文件,对服务器X开放6379端口。W已是生产环境,如此频繁操作,不大好。而且服务器量大了,技术员隔三岔五就要去添加,作为程序员,真的很厌烦这种重复性工作啦。所以就开发成可视化功能,让其他人自己来操作就好啦。


基于以上需求,于是就诞生了本篇文章。


提醒一下:

现在所说的PHP代码,是在W服务器上的。

系统环境:CentOS

文中代码xx.xx.xx.xx代表服务器X的ip地址。


服务器上没/etc/sysconfig/iptables文件?说明你还没安装iptables服务,执行如下命令:

yum -y install iptables-services


这块的功能简单总结就是如下:

端口开放状态  动作行为  结果
已开放 要求开放 不做任何动作
已开放 要求关闭 sed删除
未开放 要求开放 sed添加
未开放 要求关闭 不做任何工作


为了避免iptables文件里重复添加对服务器X开放6379端口的记录,先判断W上是否已经对其开放了6379端口。

php代码如下:

$command = "grep xx.xx.xx.xx.*6379 /etc/sysconfig/iptables";
$res = exec($command, $output);

结果var_dump($output)和$res,都为空。


这里先简要提下php里exec函数的参数及返回值:

$output 存储命令执行结果,是数组,数组里的元素对应命令执行结果的每一行内容
$res 存储命令执行结果的最后一行,是字符串


后将上面命令修改如下:

"grep xx.xx.xx.xx.*6379 /etc/sysconfig/iptables 2>&1";

此时,$output就有值了。


添加的2>&1是干嘛用的?

linux系统中,0、1、2代表文件描述符,啥东东?太抽象?看下面我的自我理解:

0:输入
1:正确输出,代表的就是shell命令执行成功后打印出来的结果
2:错误输出,代表的是shell命令执行失败后的提示存放在2这个数字代表的文件中

php的exec方法里的参数$ouput和返回值$res都是接收的正确输出,也就是1所对应的文件。


所以一开始$output没有值,就很有可能是命令执行失败了。

2>&1, 就代表把原本写到2代表的文件里的提示信息,现在转写到1指向的文件里来。


$ouput有值了,却是:

iptables permission denied


老油条一看就知道是文件权限的关系了。

在上面php代码加如下代码调试:

echo exec("whoami");

echo出来的是apache。

查看/etc/sysconfig/iptables文件的权限,用户组和用户都是root。

apache相对于root属于其他人,这里只需要给予apche读iptables权限就好了,执行如下命令即可:

chmod 704 /etc/sysconfig/iptables

ok,现在$output总算有正常结果了。



所以接下来,主要就是Linux下sed命令实现增删改的任务。

通常就以下几种情形:

在匹配位置之前插入:

sed -i '/pattern/i  hello world'  /targetFile


在匹配位置之后插入:

sed -i '/pattern/a  hello world'  /targetFile


在文件末尾追加:

sed -i '$a hello world' /targetFile


在文件指定行插入(这里3是你要指定的行数):

sed -i '3i hello world' /targetFile


替换匹配内容:

将hello world替换为hello coder zhai

sed -i 's/hello world/hello coder zhai/g' /targetFile


删除匹配行:

一行里只要含有hello world,则整行就会被删除

sed -i '/hello world/d' /targetFile


这里iptables记录追加,我是在COMMIT匹配之处前面添加,用的如下命令:

sed -i '/COMMIT/a -A INPUT -p tcp -m tcp  –s xx.xx.xx.xx --dport 6379 -j ACCEPT'  /etc/sysconfig/iptables

掌握sed这几个命令了,其它iptables的修改和删除就不在话下了,这里就不赘述了。




上一篇:20070211- 一位母亲(2019-07-14 22:10:39)
我要评论
评论列表