热爱技术
专注分享

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

博客的免费飞机场(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)回复

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

支付宝扫一扫打赏

微信扫一扫打赏