Update 实时 history 监控

This commit is contained in:
2025-10-22 09:51:17 +08:00
committed by GitHub
parent 24762ddef5
commit b4b93199d1

View File

@@ -1,10 +1,18 @@
# 创建一的监控系统 # 创建一的监控系统
cat > /usr/local/bin/mon << 'EOF' cat > /usr/local/bin/cmdwatch << 'EOF'
#!/bin/bash #!/bin/bash
LOG_FILE="/root/command_logs/monitor.log" # 配置文件
PID_FILE="/tmp/monitor.pid" CONFIG_DIR="/root/.cmdwatch"
LOCK_FILE="/tmp/monitor.lock" LOG_FILE="$CONFIG_DIR/monitor.log"
PID_FILE="$CONFIG_DIR/pid"
LOCK_FILE="$CONFIG_DIR/lock"
# 初始化
init_system() {
mkdir -p "$CONFIG_DIR"
touch "$LOG_FILE"
}
# 获取客户端IP # 获取客户端IP
get_client_ip() { get_client_ip() {
@@ -27,7 +35,7 @@ is_running() {
return 1 return 1
} }
# 获取文件锁防止重复启动 # 文件锁
get_lock() { get_lock() {
exec 200>"$LOCK_FILE" exec 200>"$LOCK_FILE"
flock -n 200 && return 0 flock -n 200 && return 0
@@ -36,63 +44,47 @@ get_lock() {
release_lock() { release_lock() {
flock -u 200 flock -u 200
rm -f "$LOCK_FILE"
} }
# to命令处理 # 停止所有可能的监控进程
if [ "$1" = "to" ]; then stop_all_monitors() {
if is_running; then echo "停止所有监控进程..."
echo "🔍 切换到前台显示模式..." # 停止当前系统
echo "💡 按 Ctrl+C 返回后台模式" if [ -f "$PID_FILE" ]; then
echo "================================" local pid=$(cat "$PID_FILE" 2>/dev/null)
[ -n "$pid" ] && kill "$pid" 2>/dev/null
if [ -f "$LOG_FILE" ]; then
echo "最近记录:"
tail -5 "$LOG_FILE"
echo "------------------------"
echo "开始实时显示..."
tail -f "$LOG_FILE"
else
echo "暂无日志记录"
fi
else
echo "🚀 启动监控系统..."
exec "$0" start
fi
exit 0
fi fi
case "$1" in # 停止其他可能运行的监控
start|background) pkill -f "cmd_monitor"
if ! get_lock; then pkill -f "monitor.sh"
echo "❌ 监控已经在运行中" pkill -f "mt"
exit 1 pkill -f "mon"
fi pkill -f "cmdwatch"
if is_running; then # 清理文件
echo "✅ 监控已在运行中 (PID: $(cat "$PID_FILE"))" rm -f "$PID_FILE"
release_lock rm -f "$LOCK_FILE"
exit 0 sleep 1
fi }
echo "🔧 启动后台监控..." # 主监控函数
start_monitoring() {
echo "启动命令监控..."
# 设置实时history(只设置一次) # 设置实时history
for user_dir in /home/* /root; do for user_dir in /home/* /root; do
[ -d "$user_dir" ] || continue [ -d "$user_dir" ] || continue
bashrc="$user_dir/.bashrc" bashrc="$user_dir/.bashrc"
[ -f "$bashrc" ] || continue [ -f "$bashrc" ] || continue
if ! grep -q "PROMPT_COMMAND.*history.*a.*c.*r" "$bashrc" 2>/dev/null; then if ! grep -q "PROMPT_COMMAND.*cmdwatch" "$bashrc" 2>/dev/null; then
echo 'export PROMPT_COMMAND="history -a; history -c; history -r"' >> "$bashrc" echo 'export PROMPT_COMMAND="history -a; history -c; history -r #cmdwatch"' >> "$bashrc"
fi fi
done done
# 创建日志目录 # 启动监控进程
mkdir -p "/root/command_logs"
# 启动单一监控进程
( (
echo "=== 监控系统启动: $(date) ===" >> "$LOG_FILE" echo "=== 命令监控启动: $(date) ===" >> "$LOG_FILE"
declare -A file_sizes declare -A file_sizes
# 初始化文件大小 # 初始化文件大小
@@ -119,7 +111,7 @@ case "$1" in
if [ -n "$new_cmd" ] && [ ${#new_cmd} -gt 1 ]; then if [ -n "$new_cmd" ] && [ ${#new_cmd} -gt 1 ]; then
# 过滤简单命令 # 过滤简单命令
case "$new_cmd" in case "$new_cmd" in
ls|cd|pwd|ll|history|exit|clear|to|mon|"."|"..") ls|cd|pwd|ll|history|exit|clear|cmdwatch|"."|"..")
continue continue
;; ;;
*) *)
@@ -127,44 +119,48 @@ case "$1" in
timestamp=$(date '+%Y-%m-%d %H:%M:%S') timestamp=$(date '+%Y-%m-%d %H:%M:%S')
log_entry="[$timestamp] 用户:$user | 命令:$new_cmd | 来源:$client_ip" log_entry="[$timestamp] 用户:$user | 命令:$new_cmd | 来源:$client_ip"
echo "$log_entry" >> "$LOG_FILE" echo "$log_entry" >> "$LOG_FILE"
file_sizes["$user"]=$current_size
;; ;;
esac esac
fi fi
file_sizes["$user"]=$current_size
fi fi
done done
sleep 2 sleep 1
done done
) & ) &
monitor_pid=$! echo $! > "$PID_FILE"
echo $monitor_pid > "$PID_FILE" echo "✅ 监控已启动 (PID: $!)"
release_lock }
echo "✅ 后台监控已启动 (PID: $monitor_pid)" # 命令处理
echo "📝 日志文件: $LOG_FILE" case "$1" in
echo "💡 使用 'mon to' 查看实时监控" start)
init_system
if ! get_lock; then
echo "❌ 监控已经在运行中"
exit 1
fi
if is_running; then
echo "✅ 监控已在运行中"
release_lock
exit 0
fi
stop_all_monitors
start_monitoring
release_lock
;; ;;
stop) stop)
if [ -f "$PID_FILE" ]; then init_system
pid=$(cat "$PID_FILE") stop_all_monitors
if ps -p "$pid" >/dev/null 2>&1; then echo "✅ 所有监控已停止"
kill "$pid" 2>/dev/null
rm -f "$PID_FILE"
rm -f "$LOCK_FILE"
echo "✅ 监控已停止 (PID: $pid)"
else
rm -f "$PID_FILE"
rm -f "$LOCK_FILE"
echo "⚠️ 监控进程不存在,已清理"
fi
else
echo " 监控未运行"
fi
;; ;;
status) status)
init_system
if is_running; then if is_running; then
pid=$(cat "$PID_FILE") pid=$(cat "$PID_FILE")
echo "✅ 监控运行中 (PID: $pid)" echo "✅ 监控运行中 (PID: $pid)"
@@ -175,80 +171,107 @@ case "$1" in
fi fi
;; ;;
logs) view|logs)
init_system
if [ "$2" = "-f" ] || [ "$1" = "view" ]; then
if [ -f "$LOG_FILE" ]; then if [ -f "$LOG_FILE" ]; then
if [ "$2" = "-f" ]; then
tail -f "$LOG_FILE" tail -f "$LOG_FILE"
else else
tail -20 "$LOG_FILE" echo "暂无日志"
fi fi
else else
echo "日志文件不存在" if [ -f "$LOG_FILE" ]; then
tail -20 "$LOG_FILE"
else
echo "暂无日志"
fi
fi fi
;; ;;
install) install)
# 停止可能运行的旧监控 init_system
"$0" stop stop_all_monitors
# 设置开机自启动 # 设置开机自启动
echo "🔧 设置开机自启动..." echo "设置开机自启动..."
(crontab -l 2>/dev/null | grep -v "$0"; echo "@reboot $0 start >/dev/null 2>&1") | crontab - (crontab -l 2>/dev/null | grep -v "cmdwatch"; echo "@reboot /usr/local/bin/cmdwatch start >/dev/null 2>&1") | crontab -
# 设置命令别名 # 设置命令别名
echo "🔧 设置命令别名..." echo "设置命令别名..."
sed -i '/alias to=/d' ~/.bashrc sed -i '/alias cmdwatch=/d' ~/.bashrc
echo "alias to='$0 to'" >> ~/.bashrc echo "alias cw='/usr/local/bin/cmdwatch view'" >> ~/.bashrc
# 重新加载配置
source ~/.bashrc
# 启动监控 # 启动监控
"$0" start /usr/local/bin/cmdwatch start
source ~/.bashrc
echo "" echo ""
echo "🎉 安装完成!" echo "🎉 安装完成!"
echo "========================" echo "========================"
echo "立即使用:" echo "使用方法:"
echo " to # 启动/查看监控" echo " cw # 查看实时监控"
echo " mon status # 查看状态" echo " cmdwatch view # 查看实时监控"
echo " mon stop # 停止监控" echo " cmdwatch status # 查看状态"
echo " mon logs # 查看日志" echo " cmdwatch stop # 停止监控"
echo " cmdwatch logs # 查看历史日志"
;; ;;
uninstall) clean)
"$0" stop echo "🧹 彻底清理所有监控系统..."
rm -f "$0" # 停止所有
pkill -f "cmd_monitor"
pkill -f "monitor.sh"
pkill -f "mt"
pkill -f "mon"
pkill -f "cmdwatch"
# 清理文件
rm -rf /root/monitor
rm -rf /root/install
rm -rf /root/.cmdwatch
rm -f /usr/local/bin/mt
rm -f /usr/local/bin/mon
rm -f /tmp/*monitor*
rm -f /tmp/cmd_monitor.*
# 清理crontab # 清理crontab
crontab -l 2>/dev/null | grep -v "$0" | crontab - (crontab -l 2>/dev/null | grep -v -E "(monitor|cmd_monitor|mt|mon|cmdwatch)") | crontab -
# 清理别名 # 清理别名
sed -i '/alias to=/d' ~/.bashrc sed -i '/alias to=/d' ~/.bashrc
echo "✅ 已卸载监控系统" sed -i '/alias mon=/d' ~/.bashrc
sed -i '/alias mt=/d' ~/.bashrc
sed -i '/alias cw=/d' ~/.bashrc
source ~/.bashrc
echo "✅ 彻底清理完成"
;; ;;
*) *)
echo "命令监控系统" echo "命令监控系统 (cmdwatch)"
echo "========================" echo "========================"
echo "使用方法:" echo "使用方法:"
echo " to # 启动/查看监控" echo " cmdwatch start # 启动监控"
echo " mon start # 启动后台监控" echo " cmdwatch stop # 停止监控"
echo " mon stop # 停止监控" echo " cmdwatch status # 查看状态"
echo " mon status # 查看状态" echo " cmdwatch view # 实时查看"
echo " mon logs # 查看日志" echo " cmdwatch logs # 查看日志"
echo " mon logs -f # 实时查看日志" echo " cmdwatch install # 安装配置"
echo " mon install # 安装配置" echo " cmdwatch clean # 彻底清理"
echo " mon uninstall # 卸载" echo ""
echo "安装后使用: cw # 查看实时监控"
;; ;;
esac esac
EOF EOF
# 给执行权限 # 给执行权限
chmod +x /usr/local/bin/mon chmod +x /usr/local/bin/cmdwatch
# 安装并启动 # 安装并启动
echo "安装一监控系统..." echo "安装一监控系统..."
mon install cmdwatch install
# 测试 # 测试
echo "测试监控系统..." echo "测试监控系统..."
to cw