因为自己的软路由安装了OpenVPN,方便随时连接到家里网络,出于安全考虑,害怕秘钥泄露导致某些人可以随时连接到我的家庭网络中来干一些坏事而我缺不知道,所以写了这个小脚本.
考虑到有些性能不太好的软路由,可能系统打包的时候没有安装python或者jamvm,所以是用的shell来写的.
当检测到有客户端连接或者断开的时候会微信推送通知你,具体内容可以自己改(更改mess的拼接就可以),这里我只是通知了使用的那个秘钥来登陆的.
运行需要给执行权限, ./方式来运行.
#!/usr/bin/env bash #openwrt系统下openvpn_status.log这个文件的路由(默认就是下面这个位置) export readonly readonly OPENVPN_STATUS_FILE="/var/log/openvpn_status.log" #server酱的秘钥 export readonly SCKEY="SCU58178T7009b6a0f6e7236bac0e" export routing_table="" export mess="" declare -A routing_map function get_routing_table() { routing_table=$(sed -n '/ROUTING TABLE/,/GLOBAL STATS/p' ${OPENVPN_STATUS_FILE} | sed '$d' | sed '1,2d') } function analyse() { #路由表不是空的 if [[ ${routing_table} != "" ]]; then #读取一行 echo "${routing_table}" >./.temp while read line; do # local virtual_address=$(get_virtual_address $line) local common_name=$(get_common_name $line) local real_address=$(get_real_address $line) local last_ref=$(get_last_ref $line) #openwrt的date命令无法格式化默认的时间格式 line=$(echo "$line" | sed "s/${last_ref}/$(date +%s)/") # echo $virtual_address # echo $common_name # echo $real_address # echo $last_ref # echo "---------------------------" has_key $common_name #map中含有这个key证明是在线状态 if [[ $? -eq 1 ]]; then local old_real_address=$(get_real_address ${routing_map[${common_name}]}) #检测登陆的账户的ip是否变了 if [[ ${old_real_address} != ${real_address} ]]; then echo "${common_name}的IP地址变了" mess="${mess}${common_name}的IP变成了</br>" fi #不含有,证明新用户上线 else echo "${common_name}上线了" #构造通知信息 mess="${mess}${common_name}上线了</br>" fi #更新下时间 routing_map["${common_name}"]="${line}" done <.temp fi } function unset_disconnect_client() { for key in ${!routing_map[@]}; do value=${routing_map[$key]} last_ref=$(get_last_ref $value) now_date=$(date +%s) local common_name=$(get_common_name $value) if [[ $(expr $now_date - $last_ref) -gt 60 ]]; then mess="${mess}${common_name}断开了连接</br>" unset routing_map[$key] fi done } #需要参数: $1 text $2 desp function send_wx_mess() { a=0 while [[ true ]]; do #server酱的限制是5分钟不能发送重复内容 if [[ a -gt 6 ]]; then break fi local result=$(curl -s "https://sc.ftqq.com/${SCKEY}.send?text=$1&desp=$2" | grep "success") if [[ ${result} != "" ]]; then echo "发送成功" break else let a++ echo "消息发送失败,一分钟之后再试" echo "error: $result" sleep 1m fi done } # has_key key # 返回 1 是有这个key 返回0 是没有这个key function has_key() { for key in ${!routing_map[@]}; do if [[ $key == $1 ]]; then return 1 fi done return 0 } #获取登陆者的虚拟ip function get_virtual_address() { echo $(echo "${1}" | awk -F"[,]+" '{print $1}') } #获取登陆者是使用的那个秘钥文件登录的 function get_common_name() { echo $(echo "${1}" | awk -F"[,]+" '{print $2}') } #获取登陆者的真实的ip function get_real_address() { local temp_real_address=$(echo "${1}" | awk -F"[,]+" '{print $3}') #去除端口号 echo ${temp_real_address:0:$(expr index ${temp_real_address} :)-1} } #获取最后数据更新的时间 function get_last_ref() { local temp_last_ref=$(echo "${1}" | awk -F"[,]+" '{print $4}') # echo $(date -D "${temp_last_ref}" +"%Y-%m-%d %H:%M.%S") # echo $(date -D "${temp_last_ref}" +%s) echo ${temp_last_ref} } while [[ true ]]; do get_routing_table analyse unset_disconnect_client if [[ ${mess} != "" ]]; then #statements send_wx_mess "OpenVPN客户端通知" ${mess} fi sleep 30s mess="" done
还没有评论,来说两句吧...