Update 实时 history 监控

This commit is contained in:
2025-10-21 23:46:23 +08:00
committed by GitHub
parent 747ade1c39
commit 325fe07e64

View File

@@ -67,60 +67,126 @@ log_message() {
# 英文转中文函数 # 英文转中文函数
english_to_chinese() { english_to_chinese() {
local text="$1" local text="$1"
# 常见国家地区翻译 text=$(echo "$text" | sed \
text=$(echo "$text" | sed -e 's/China/中国/g' -e 's/United States/美国/g' -e 's/Japan/日本/g' -e 's/Korea/韩国/g' \ -e 's/China/中国/g' \
-e 's/Russia/俄罗斯/g' -e 's/Germany/德国/g' -e 's/France/法国/g' -e 's/UK/英国/g' -e 's/Canada/加拿大/g' \ -e 's/United States/美国/g' \
-e 's/Australia/澳大利亚/g' -e 's/Brazil/巴西/g' -e 's/India/印度/g') -e 's/Japan/日本/g' \
-e 's/Korea/韩国/g' \
-e 's/Russia/俄罗斯/g' \
-e 's/Germany/德国/g' \
-e 's/France/法国/g' \
-e 's/UK/英国/g' \
-e 's/Canada/加拿大/g' \
-e 's/Australia/澳大利亚/g' \
-e 's/Brazil/巴西/g' \
-e 's/India/印度/g' \
-e 's/Beijing/北京/g' \
-e 's/Shanghai/上海/g' \
-e 's/Guangzhou/广州/g' \
-e 's/Shenzhen/深圳/g' \
-e 's/Hangzhou/杭州/g' \
-e 's/Nanjing/南京/g' \
-e 's/Wuhan/武汉/g' \
-e 's/Chengdu/成都/g' \
-e 's/Xi'an/西安/g' \
-e 's/Chongqing/重庆/g' \
-e 's/Tianjin/天津/g' \
-e 's/Suzhou/苏州/g' \
-e 's/Zhengzhou/郑州/g' \
-e 's/Changsha/长沙/g' \
-e 's/Hefei/合肥/g' \
-e 's/Nanchang/南昌/g' \
-e 's/Fuzhou/福州/g' \
-e 's/Jinan/济南/g' \
-e 's/Taiyuan/太原/g' \
-e 's/Hohhot/呼和浩特/g' \
-e 's/Shijiazhuang/石家庄/g' \
-e 's/Harbin/哈尔滨/g' \
-e 's/Changchun/长春/g' \
-e 's/Jilin/吉林/g' \
-e 's/Dalian/大连/g' \
-e 's/Qingdao/青岛/g' \
-e 's/Ningbo/宁波/g' \
-e 's/Xiamen/厦门/g' \
-e 's/Kunming/昆明/g' \
-e 's/Guiyang/贵阳/g' \
-e 's/Nanning/南宁/g' \
-e 's/Haikou/海口/g' \
-e 's/Urumqi/乌鲁木齐/g' \
-e 's/Lanzhou/兰州/g' \
-e 's/Xining/西宁/g' \
-e 's/Yinchuan/银川/g' \
-e 's/Lhasa/拉萨/g' \
-e 's/Hong Kong/香港/g' \
-e 's/Macau/澳门/g' \
-e 's/Taiwan/台湾/g' \
-e 's/Jiangxi/江西/g' \
-e 's/Zhejiang/浙江/g' \
-e 's/Jiangsu/江苏/g' \
-e 's/Guangdong/广东/g' \
-e 's/Fujian/福建/g' \
-e 's/Hunan/湖南/g' \
-e 's/Hubei/湖北/g' \
-e 's/Henan/河南/g' \
-e 's/Hebei/河北/g' \
-e 's/Shandong/山东/g' \
-e 's/Shanxi/山西/g' \
-e 's/Shaanxi/陕西/g' \
-e 's/Sichuan/四川/g' \
-e 's/Yunnan/云南/g' \
-e 's/Guizhou/贵州/g' \
-e 's/Liaoning/辽宁/g' \
-e 's/Jilin/吉林/g' \
-e 's/Heilongjiang/黑龙江/g' \
-e 's/Anhui/安徽/g' \
-e 's/Gansu/甘肃/g' \
-e 's/Qinghai/青海/g' \
-e 's/Telecom/电信/g' \
-e 's/Unicom/联通/g' \
-e 's/Mobile/移动/g' \
-e 's/Network/网络/g' \
-e 's/Communications/通信/g' \
-e 's/Company/公司/g' \
-e 's/Corporation/集团/g' \
-e 's/Limited/有限公司/g' \
-e 's/CHINA169/中国联通/g' \
-e 's/ChinaNet/中国电信/g' \
-e 's/CMNET/中国移动/g')
echo "$text" echo "$text"
} }
# 多IP查询源函数 # 获取IP地理位置
get_ip_location_online() { get_ip_location() {
local ip="$1" local ip="$1"
local location_info="" local location_info=""
for service in "${IP_API_SERVICES[@]}"; do if [[ "$ip" == "127.0.0.1" ]] || [[ "$ip" == "localhost" ]] || [[ "$ip" == "unknown" ]]; then
case $service in echo "本机"
"ipapi") return 0
location_info=$(curl -s -m 3 "http://ip-api.com/json/$ip?fields=status,country,regionName,city,isp,as" 2>/dev/null || true) fi
;;
"ipapi.co")
location_info=$(curl -s -m 3 "https://ipapi.co/$ip/json/" 2>/dev/null || true)
;;
"ipinfo.io")
location_info=$(curl -s -m 3 "https://ipinfo.io/$ip" 2>/dev/null || true)
;;
"ip-api.com")
location_info=$(curl -s -m 3 "https://ip-api.com/json/$ip" 2>/dev/null || true)
;;
"whois.pconline.com.cn")
location_info=$(curl -s -m 3 "https://whois.pconline.com.cn/ipJson.jsp?ip=$ip&json=true" 2>/dev/null || true)
;;
*)
location_info=""
;;
esac
# 查询缓存
if [ "$CACHE_IP_INFO" = true ] && [ -f "$IP_CACHE_FILE" ]; then
location_info=$(grep "^$ip|" "$IP_CACHE_FILE" | head -1 | cut -d'|' -f3-)
if [ -n "$location_info" ]; then if [ -n "$location_info" ]; then
local country=$(echo "$location_info" | grep -o '"country":"[^"]*"' | cut -d'"' -f4) echo "$location_info"
local region=$(echo "$location_info" | grep -o '"regionName":"[^"]*"' | cut -d'"' -f4) return 0
local city=$(echo "$location_info" | grep -o '"city":"[^"]*"' | cut -d'"' -f4)
local isp=$(echo "$location_info" | grep -o '"isp":"[^"]*"' | cut -d'"' -f4)
if [ -n "$country" ]; then
local result="$country"
[ -n "$region" ] && result="$result-$region"
[ -n "$city" ] && result="$result-$city"
[ -n "$isp" ] && result="$result($isp)"
echo "$result"
return 0
fi
fi fi
done fi
echo "未知位置" # 查询在线API
return 1 location_info=$(get_ip_location_online "$ip")
if [ -z "$location_info" ]; then
location_info="未知位置"
fi
# 缓存结果
if [ "$CACHE_IP_INFO" = true ]; then
echo "$ip|$(date +%s)|$location_info" >> "$IP_CACHE_FILE"
fi
echo "$location_info"
} }
# 获取客户端IP # 获取客户端IP
@@ -133,77 +199,60 @@ get_client_ip() {
ip=$(echo "$SSH_CONNECTION" | awk '{print $1}') ip=$(echo "$SSH_CONNECTION" | awk '{print $1}')
else else
ip=$(who -m 2>/dev/null | awk '{print $5}' | sed 's/[()]//g' | head -1) ip=$(who -m 2>/dev/null | awk '{print $5}' | sed 's/[()]//g' | head -1)
if [[ "$ip" == ":0" ]] || [[ "$ip" == ":1" ]] || [[ -z "$ip" ]]; then
ip="localhost"
fi
fi fi
echo "$ip" echo "$ip"
} }
# 日志轮转检查
check_log_rotation() {
local current_time=$(date +%s)
if [ $((current_time - LAST_ROTATION)) -ge $LOG_ROTATE_INTERVAL ]; then
log_rotation "time"
return 0
fi
if [ -f "$CURRENT_LOG" ]; then
local log_size=$(stat -c%s "$CURRENT_LOG" 2>/dev/null || echo 0)
if [ "$log_size" -gt 1048576 ]; then
log_rotation "size"
return 0
fi
fi
return 1
}
# 初始化日志系统 # 初始化日志系统
init_log_system() { init_log_system() {
mkdir -p "$LOG_DIR" mkdir -p "$LOG_DIR"
CURRENT_LOG="$LOG_DIR/monitor_$(date '+%Y%m%d_%H%M%S').log"
CURRENT_LOG=$(generate_log_filename)
LATEST_LOG="$LOG_DIR/latest.log"
ln -sf "$CURRENT_LOG" "$LATEST_LOG" 2>/dev/null || true
LAST_ROTATION=$(date +%s)
log_message "INFO" "监控脚本启动 - PID: $$" log_message "INFO" "监控脚本启动 - PID: $$"
local client_ip=$(get_client_ip)
log_message "INFO" "客户端IP: $client_ip"
local location_info=$(get_ip_location "$client_ip")
log_message "INFO" "地理位置: $location_info"
log_message "INFO" "日志文件: $CURRENT_LOG"
log_message "INFO" "日志轮转: ${LOG_ROTATE_INTERVAL}秒或${MAX_LOG_SIZE}"
} }
# 主监控函数 # 后台监控启动
start_background_monitor() {
log_message "INFO" "启动后台监控进程..."
# 启动日志监控进程
monitor_resources &
# 启动命令监控
start_main_monitor
}
# 启动命令监控
start_main_monitor() { start_main_monitor() {
log_message "INFO" "启动主监控进程..." log_message "INFO" "命令监控启动..."
while true; do while true; do
sleep 60 sleep 1
local ip=$(get_client_ip)
# 检查日志轮转条件 local location_info=$(get_ip_location "$ip")
check_log_rotation log_message "COMMAND" "客户端IP: $ip | 位置: $location_info"
# 只监控内存使用
local mem_usage=$(free 2>/dev/null | awk 'NR==2{printf "%.2f", $3*100/$2}' || echo "0")
if (( $(echo "$mem_usage > 90" | bc -l 2>/dev/null) )); then
log_message "WARN" "内存使用率过高: ${mem_usage}%"
fi
# 检查磁盘空间
local disk_usage=$(df "$LOG_DIR" 2>/dev/null | awk 'NR==2{print $5}' | cut -d'%' -f1 || echo "0")
if [ "$disk_usage" -gt 90 ]; then
log_message "WARN" "磁盘使用率过高: ${disk_usage}%"
fi
done done
} }
# 显示使用说明 # 显示帮助信息
show_usage() { show_usage() {
echo -e "${GREEN}实时命令监控系统 v3.3 echo -e "${GREEN}实时命令监控系统 v3.3${NC}"
echo "用法: $0 [选项]"
echo " -d, --daemon 后台运行模式"
echo " -s, --status 查看监控状态"
echo " -k, --kill 停止监控进程"
echo " -h, --help 显示帮助"
}
# 主程序
main() {
local command="${1:-}"
case "$command" in
-d|--daemon) start_background_monitor ;;
-s|--status) check_monitor_status ;;
-k|--kill) stop_monitor ;;
-h|--help|"") show_usage ;;
*) echo -e "${RED}未知选项: $command${NC}"; show_usage; exit 1 ;;
esac
}
# 执行主程序
main "$1"