首页 > 其他分享 >bash脚本监控服务器SSH登录,每30分钟运行一次,发现登录发送到企业微信群

bash脚本监控服务器SSH登录,每30分钟运行一次,发现登录发送到企业微信群

时间:2024-05-16 21:20:00浏览次数:22  
标签:whitelisted 登录 微信群 ip 30 echo 白名单 fi local

// 开始循环检测
//loopCheck();


// 在每分钟的第 30 秒执行目标函数
cron.schedule('35 8 * * *', () => {
    console.log('目标函数在8:35执行!');
        loopCheck_info();
    // 在这里调用你想要定时执行的函数
});

cron.schedule('*/30 9-20 * * *', () => {
    console.log('目标函数在每分钟的第 50分钟执行!');
        loopCheck();
    // 在这里调用你想要定时执行的函数
});
root@aea87fa6e6a2:/home/node# crontab -e
bash: crontab: command not found
root@aea87fa6e6a2:/home/node# exit
exit
[root@localhost ~]# crontab -e
crontab: no changes made to crontab
[root@localhost ~]# cat log.sh
#!/bin/bash

# 发送日志到API的函数
sendLogsToAPI() {
    local logs=$1
    local ip=$2
    local datetime=$3

    local resData='{
        "msgtype": "text",
        "text": {
            "content": "'"${datetime}\n${ip}\n在30分钟内有用户登录:\n${logs}"'"
        }
    }'

    curl -X POST \
        -H "Content-Type: application/json" \
        -d "$resData" \
        "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=17e3b586-20b3-4283-adf2-eca2ffa84130"

    echo "提示成功!"
    echo  "$logs" >> /var/log/logins
}

# 获取当前的日期时间字符串
datetime=$(date +"%Y年%m月%d日 %H:%M")
echo "脚本启动时间:$datetime" >> /var/log/logins

# 获取本机出口网卡的IP地址
IP=$(/usr/sbin/ip route get 1 | grep -oE 'src \S+' | awk '{print $2}')

# 白名单列表
whitelist=("192.168.10.99" "192.168.1.101")  # 示例白名单列表

# 提取最近30分钟的日志记录
recent_logs=$(tail /var/log/secure -n100 | awk -v end="$(date "+%b %_d %H:%M:%S" -d "-30 minutes")" -v start="$(date "+%b %_d %H:%M:%S")" '{current=$1" "$2" "$3; if (current >= end && current <= start) print}')

# 初始化变量
output=""

# 密码登录成功
password_success=$(echo "$recent_logs" | grep 'Accepted password' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $1}')
if [ -n "$password_success" ]; then
    for ip in $password_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="密码登录成功: $ip"$'\n'
    done
fi

# 密码登录失败
password_failure=$(echo "$recent_logs" | grep 'Failed password' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $1}')
if [ -n "$password_failure" ]; then
    for ip in $password_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="密码登录失败: $ip"$'\n'
    done
fi



# 证书登录成功
certificate_success=$(echo "$recent_logs" | grep 'Accepted publickey' | grep -oE 'from [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}')
if [ -n "$certificate_success" ]; then
    for ip in $certificate_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="证书登录成功: $ip"$'\n'
    done
fi



# 证书登录失败
certificate_failure=$(echo "$recent_logs" | grep 'authentication failure' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $1}')
if [ -n "$certificate_failure" ]; then
    for ip in $certificate_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="证书登录失败: $ip"$'\n'
    done
fi

# 本地认证成功
local_auth_success=$(echo "$recent_logs" | grep 'login: LOGIN' | grep -oE 'FROM [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}')
if [ -n "$local_auth_success" ]; then
    for ip in $local_auth_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地认证成功: $ip"$'\n'
    done
fi

# 本地认证失败
local_auth_failure=$(echo "$recent_logs" | grep 'login: FAILED' | grep -oE 'FROM [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}')
if [ -n "$local_auth_failure" ]; then
    for ip in $local_auth_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地认证失败: $ip"$'\n'
    done
fi

# 本地登录成功
local_login_success=$(echo "$recent_logs" | grep 'login:' | grep -oE 'ON tty' | awk '{print $2}')
if [ -n "$local_login_success" ]; then
    for ip in $local_login_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地登录成功: $ip"$'\n'
    done
fi

# 本地登录失败
local_login_failure=$(echo "$recent_logs" | grep 'login: FAILED' | grep -oE 'FROM tty' | awk '{print $2}')
if [ -n "$local_login_failure" ]; then
    for ip in $local_login_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地登录失败: $ip"$'\n'
    done
fi







# 打印结果
if [ -n "$output" ]; then
    sleep $((RANDOM % 5 + 2))  # 随机延迟2到5秒
    echo "$IP 获取到30分钟内的登录信息:"
    echo "$output"
    sendLogsToAPI "$output" "$IP" "$datetime"
fi

 

 

 

下面是正式版本:

 

#!/bin/bash

# 发送日志到API的函数
sendLogsToAPI() {
    local logs=$1
    local ip=$2
    local datetime=$3

    local resData='{
        "msgtype": "text",
        "text": {
            "content": "'"${datetime}\n${ip}\n在30分钟内有用户登录:\n${logs}"'"
        }
    }'

    curl -X POST \
        -H "Content-Type: application/json" \
        -d "$resData" \
        "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8ff711ab-f80b-7adf0831a8bc"

    echo "提示成功!"
    echo  "$logs" >> /var/log/logins
}

# 获取当前的日期时间字符串
datetime=$(date +"%Y年%m月%d日 %H:%M")
echo "脚本启动时间:$datetime" >> /var/log/logins

# 获取本机出口网卡的IP地址
IP=$(/usr/sbin/ip route get 1 | grep -oE 'src \S+' | awk '{print $2}')

# 白名单列表
whitelist=("192.168.0.9" "192.168.1.1")  # 示例白名单列表

# 提取最近30分钟的日志记录
recent_logs=$(tail /var/log/secure -n100 | awk -v end="$(date "+%b %_d %H:%M:%S" -d "-30 minutes")" -v start="$(date "+%b %_d %H:%M:%S")" '{current=$1" "$2" "$3; if (current >= end && current <= start) print}')

# 初始化变量
output=""

# 密码登录成功
password_success=$(echo "$recent_logs" | grep 'Accepted password' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $1}')
if [ -n "$password_success" ]; then
    for ip in $password_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="密码登录成功: $ip"$'\n'
    done
fi

# 密码登录失败
password_failure=$(echo "$recent_logs" | grep 'Failed password' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $1}')
if [ -n "$password_failure" ]; then
    for ip in $password_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="密码登录失败: $ip"$'\n'
    done
fi



# 证书登录成功
certificate_success=$(echo "$recent_logs" | grep 'Accepted publickey' | grep -oE 'from [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}')
if [ -n "$certificate_success" ]; then
    for ip in $certificate_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="证书登录成功: $ip"$'\n'
    done
fi



# 证书登录失败
certificate_failure=$(echo "$recent_logs" | grep 'authentication failure' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $1}')
if [ -n "$certificate_failure" ]; then
    for ip in $certificate_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="证书登录失败: $ip"$'\n'
    done
fi

# 本地认证成功
local_auth_success=$(echo "$recent_logs" | grep 'login: LOGIN' | grep -oE 'FROM [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}')
if [ -n "$local_auth_success" ]; then
    for ip in $local_auth_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地认证成功: $ip"$'\n'
    done
fi

# 本地认证失败
local_auth_failure=$(echo "$recent_logs" | grep 'login: FAILED' | grep -oE 'FROM [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}')
if [ -n "$local_auth_failure" ]; then
    for ip in $local_auth_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地认证失败: $ip"$'\n'
    done
fi

# 本地登录成功
local_login_success=$(echo "$recent_logs" | grep 'login:' | grep -oE 'ON tty' | awk '{print $2}')
if [ -n "$local_login_success" ]; then
    for ip in $local_login_success; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地登录成功: $ip"$'\n'
    done
fi

# 本地登录失败
local_login_failure=$(echo "$recent_logs" | grep 'login: FAILED' | grep -oE 'FROM tty' | awk '{print $2}')
if [ -n "$local_login_failure" ]; then
    for ip in $local_login_failure; do
        # 检查是否在白名单内
        is_whitelisted=false
        for whitelisted_ip in "${whitelist[@]}"; do
            if [[ "$ip" == "$whitelisted_ip" ]]; then
                is_whitelisted=true
                break
            fi
        done

        # 如果在白名单内,记录到日志文件
        if $is_whitelisted; then
            echo "$datetime $ip 在白名单内,登录信息未发送到API" >> /var/log/logins
            continue
        fi

        output+="本地登录失败: $ip"$'\n'
    done
fi







# 打印结果
if [ -n "$output" ]; then
    sleep $((RANDOM % 5 + 2))  # 随机延迟2到5秒
    echo "$IP 获取到30分钟内的登录信息:"
    echo "$output"
    sendLogsToAPI "$output" "$IP" "$datetime"
fi

 

标签:whitelisted,登录,微信群,ip,30,echo,白名单,fi,local
From: https://www.cnblogs.com/aldary/p/18196748

相关文章

  • NODEJS通过发送json数据查询目标服务,实现服务器状态监控,发现异常发送到微信群提醒
    root@aea87fa6e6a2:/home/node#catlogin2.jsconstrequest=require('request-promise');constmoment=require('moment');constcron=require('node-cron');process.env.TZ='Asia/Shanghai';//设置时区为上海时区constrp......
  • 登录宝塔面板提示参数格式错误解决方法
    问题描述:登录宝塔面板提示参数格式错误,如下图所示 解决方法:登录服务器SSH终端中执行下面命令(非面板终端)修复面板1.删除之前无法使用的面板环境(不会影响当前网站数据的使用)mv  /www/server/panel/pyenv /www/backup/pyenv2.重新获取新的面板环境和更新包curl http://dow......
  • 模拟浏览器登录页面中记录账号弹出选择框
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>PopupDivExample</title><s......
  • 登录拦截器
    对于管理系统或其他需要用户登录的系统,都需要登录验证,如果没有登录就不行进行相应的操作。SpringBoot通过实现HandlerInterceptor接口实现拦截器,通过实现WebMvcConfigurer接口实现一个配置类,在配置类中注入拦截器,最后再通过@Configuration注解注入配置。实现HandlerInt......
  • ssh免密登录本机设置
    设置SSH免密登录本机主要涉及生成密钥对、将公钥复制到本地(或远程服务器,如果是双向免密)以及测试免密登录等步骤。以下是一个基本的设置流程:生成密钥对:打开终端或命令提示符,并执行以下命令来生成RSA密钥对:ssh-keygen-trsa系统将会提示你指定保存密钥文件的路径和文件名。......
  • 使用命令登录harbor报错authentication required解决方法
    使用命令在终端登录harbor报错报错信息如下#dockerlogin192.168.3.61Authenticatingwithexistingcredentials...StoredcredentialsinvalidorexpiredUsername(admin):adminPassword:Errorresponsefromdaemon:Get"http://192.168.3.61/v2/":unauthorized:......
  • JSR303数据校验
    JSR-303是JAVAEE6中的一项子规范,叫做BeanValidation,官方参考实现是HibernateValidator。引入依赖<!--引入validation的场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artif......
  • 【django学习-25】登录及使用中间件进行登录校验
    1.登录功能实现1.1:管理员表fromdjango.dbimportmodelsclassAdmin(models.Model):"""管理员"""username=models.CharField(verbose_name="用户名",max_length=32)password=models.CharField(verbose_name="密码......
  • 网站应用微信登录 DEMO
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>网站应用微信登录DEMO</title&g......
  • index.js from Terser Error: error:0308010C:digital envelope routines::unsupporte
    Vue报错error:0308010C:digitalenveloperoutines::unsupported出现这个错误是因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.方法1.打开终端(按健win+R弹出窗口,键盘输入cmd,然后敲回车)并......