热爱技术
专注分享

一个简单的脚本 验证数据库用户注册自动刷新节点 附思路分析

博客的免费飞机场(https://vpn.xiaoweigod.com/)最近注册的人越来越多,慢慢地发现了一个比较严重的bug。当用户在web页面注册完毕之后,远程节点却经常迟迟不同步账号信息。因此会导致这种现象:虽然注册激活成功了,但是无法使用,可能过一天就好了,也可能一直都没用。等下一次手动重启了远程节点又好了。

造成这个bug的原因是节点和数据库分开在不同的主机,且主服务器在用户注册后偶尔无法发送更新节点的命令,这个问题就一直成了一个梗。

最近终于有点时间了,想到了一个比较好的点子。

思路如下:

节点服务器上编写一个脚本,这个脚本会自动连接飞机场的数据库,检测是否有新用户注册,如果有,那么自动重启节点的服务,以此来同步数据库。

因为Linux脚本方面的东西我没有系统学过,所以今天实现功能的这个脚本,完全都是靠百度,举一反三,一点一点凑出来的,如果其中有可以改善的地方,欢迎大家提提意见!

详细的思路如下:

脚本原理大致是每隔每隔一分钟读取一次远程数据库内user表中的id(新用户注册id会变多),然后通过后一分钟读取的id和前一分钟读取的id作对比,如果id变大或者变小了就重启节点,如果id不变就继续监测。

  1. 为了保证脚本能够24小时不间断运行,所以需要一个无限循环语句,这里我们选择for循环。

  2. 除此之外,对于数据库内的内容有需要对比的地方,需要一个判断语句,这里选择if。

  3. 为了保证更新的及时性并避免服务器负载过大,需要延时执行循环,这里选择sleep。

  4.数据库操作用mysql命令即可。

脚本内容如下(后面有注释):

#!/bin/bash
clear

版权信息

echo 本脚本为小伟博客开发,欢迎大家使用! echo 小伟博客:https://www.xiaoweigod.com/ echo 小伟博客网络加速器 https://vpn.xiaoweigod.com/ echo 小伟博客免费VIP影院 https://v.xiaoweigod.com/ echo  echo 

判断是否在SSR目录下

if [ -e logrun.sh ]; then echo else echo 请将脚本放到SSR根目录下运行! exit fi

判断是否安装数据库

which mysql >mysqlpath if [ $? -eq 1 ]; then echo 数据库客户端未安装,正在执行安装... sudo yum -y install mysql else echo 检测到已安装数据库客户端... fi

判断有无账号密码信息

if [ -e temp ]; then username=$(cat temp| awk 'NR==1') password=$(cat temp| awk 'NR==2') dbname=$(cat temp| awk 'NR==3') host=$(cat temp| awk 'NR==4') else  

如果是第一次运行那么录入账号密码保存到temp文件中

echo date -d"1 week ago" +"%F %H:%M:%S"   首次运行,开始配置... echo -n 请输入远程数据库用户名: read username echo $username >>temp echo -n 请输入远程数据库密码: stty -echo read password stty echo echo $password >>temp echo echo -n 请输入远程数据库名: read dbname echo $dbname >>temp echo -n 请输入远程数据库地址: read host echo $host >>temp echo echo 信息录入完成,正在执行操作...  fi

测试数据库连接,账号密码没错的话就继续操作

echo date -d"1 week ago" +"%F %H:%M:%S"   正在测试数据库连接... dbtest=mysql -u$username -p$password -h$host $dbname <<EOF show tables; EOF if [ ! -n "$dbtest" ]; then echo 数据库连接失败,请重新运行脚本! rm -rf temp exit exit else echo date -d"1 week ago" +"%F %H:%M:%S"   数据库连接成功! fi

开始运行,先重启一下节点

echo date -d"1 week ago" +"%F %H:%M:%S"   节点重启中...  echo date -d"1 week ago" +"%F %H:%M:%S"   程序开始运行,重启节点 >>run.log /bin/bash stop.sh sleep 3s /bin/bash logrun.sh

监测开始

echo $time 远程节点监测开始... echo $time 当前每分钟监测一次节点... set i=0 set j=0

最外层的for循环,定义一个无限循环

for((i=0;i<10;)) do      let "j=j+1"

读取数据库中的节点用户数量和用户信息

    data0=mysql -u$username -p$password -h$host $dbname <<EOF     select id from user order by id desc limit 1; EOF     echo $data0 >count0     sed -i 's/id //g' count0     userdata0=mysql -u$username -p$password -h$host $dbname <<EOF     select passwd,enable,method,custom_method,protocol,protocol_param,obfs,obfs_param,expire_time,status from user; EOF

一分钟后再次读取数据库中的用户数量和用户信息

    sleep 1m     data1=mysql -u$username -p$password -h$host $dbname <<EOF     select id from user order by id desc limit 1; EOF     echo $data1>count1     sed -i 's/id //g' count1     userdata1=mysql -u$username -p$password -h$host $dbname <<EOF     select passwd,enable,method,custom_method,protocol,protocol_param,obfs,obfs_param,expire_time,status from user; EOF

定义循环内的变量

time=date -d"1 week ago" +"%F %H:%M:%S" 

开始判断

1.判断用户数据是否修改

    if [[ $(cat count1) -eq $(cat count0) && $userdata0 != $userdata1 ]] ;then      /bin/bash stop.sh     sleep 3s     /bin/bash logrun.sh     echo $time 发现用户信息修改,节点更新完成!     echo $time 用户信息修改,更新节点... >>run.log

2.判断用户是否无操作

    elif [[ $(cat count1) -eq $(cat count0) && $userdata0 == $userdata1 ]] ;then      echo date -d"1 week ago" +"%F %H:%M:%S"  节点第 $j 次监测中...

3.判断用户是否删除

    elif [[ $(cat count1) -lt $(cat count0) ]] ;then      /bin/bash stop.sh     sleep 3s     /bin/bash logrun.sh     echo $time 发现用户删除,节点更新完成!     echo $time 用户删除,更新节点... >>run.log

4.判断用户是否注册

    elif [[ $(cat count1) -gt $(cat count0) ]]; then     /bin/bash stop.sh     sleep 3s     /bin/bash logrun.sh     echo $time 发现用户注册,节点更新完成!     echo $time 用户注册,节点更新... >>run.log     else echo 出错了!     fi  done

运行效果如图(中间特意增删了用户):

blob.png

一键部署节点自动监测(支持centos):

cd ~/shadowsocksr
wget https://www.xiaoweigod.com/autorst.sh && chmod +x autorst.sh && ./autorst.sh

赞(3) 打赏
未经允许不得转载:小伟博客 » 一个简单的脚本 验证数据库用户注册自动刷新节点 附思路分析

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    博主,我想问一下,我根据你的那个SS-panel-modV3搭建教程已经成功搭建位置了,但我想把ssr的端口固定位443端口,请问怎么设置呢

    abc2年前 (2018-03-15)回复

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏