需求分析:
apache vhost站点设置了仅允许部分ip访问,如果客户端是动态ip,那么每次更换ip的时候都得手动添加,而且不知道运营商释放更新ip是什么时候,所以打算通过一个固定的客户端每分钟访问服务器提供的一个php页面,然后服务器端的php页面受访之后记录客户端ip到文件,然后通过服务端设置每分钟运行脚本,检测ip文件是否变更,如果变更了就替换apache配置文件中原ip,达到客户端环境一直允许访问vhost站点
代码如下:
服务器php代码:
<?php $ip=$_SERVER["REMOTE_ADDR"]; $access="20170315"; //设置一个验证,仅仅允许提供了验证的去更改ip if ($_GET['access'] == $access ) { $myfile = fopen("ip.txt", "w"); fwrite($myfile, $ip); fclose($myfile); }
需要将这个目录以及文件设置成apache所属用户及所属组
服务器 shell 每分钟执行代码:
#!/bin/bash ippath="/data/www/" #php所在路径 httpconf="/etc/httpd/conf/httpd.conf" #apache配置文件路径 ipoldp=${ippath}/ip.old #原ip文件路径 ipnewp=${ippath}/ip.txt #新提交ip文件路径 ipold=`cat $ipoldp` #原ip ipnew=`cat $ipnewp` #新ip linenum="1014" #原ip所在行数,可以不验证行数 AddIP() { echo sed -i '${linenum}i\"Allow From "$1' $httpconf } RepIP() { echo sed -i '${line}s/Allow From $1/Allow From $2/g' $httpconf } if [ -f $ipoldp -a -f $ipnewp ]; then #当ipold和ipnew都存在的时候 diff $ipoldp $ipnewp #对比两个ip是否相同 if [ $? == 0 ]; then #当相同的时候 grep -w $ipold $httpconf #查看http配置文件中是否存在此ip if [ $? == 1 ]; then AddIP $ipold #如果不存在就添加允许 elif [ $? == 1 ]; then #当不同的时候 grep -w $ipold $httpconf #查看http配置文件中是否存在 旧ip if [ $? == 1 ]; then AddIP $ipnew #如果不存在就直接添加 新ip elif [ $? == 0 ]; then RepIP $ipnew #如果存在则将 旧ip 替换为 新ip fi echo $ipnew > $ipoldp #将新ip写入旧ip文件,作为旧ip存在 else #新旧文件丢失 echo `date "+%Y-%m-%d %H:%M:%S 星期%u"` | mail -s "www src ip file lose." [email protected] #文件异常丢失的时候发送邮件提醒 fi #可以在更改ip成功之后发送邮件提醒,有需要自行添加
客户端每分钟执行shell 代码:
#!/bin/bash curl http://域名/ip.php?access=20170315 #通过提交access字段验证,服务器get获取验证
© 著作权归作者所有
文章评论(1)
需要注意的是,这个页面的访问地址不应该配置在添加ip的那个上面,因为如果ip一变动,那么就访问不到了