Update 02

This commit is contained in:
2025-11-05 21:56:16 +08:00
committed by GitHub
parent fa08770d13
commit 448d841994

422
02
View File

@@ -1,7 +1,7 @@
#!/bin/bash
# 增强版控制器客户端
# 支持后台运行、开机自启、进程管理
# 自动设置版控制器客户端
# 运行时自动设置开机启动、启动客户端、后台运行
SERVER_IP="159.138.58.239" # 修改为你的服务器IP
SERVER_PORT=5555
@@ -9,7 +9,7 @@ CLIENT_PORT=5556
HEARTBEAT_INTERVAL=30
CONFIG_FILE="/etc/controller_client.conf"
PID_FILE="/var/run/controller_client.pid"
LOG_FILE="/var/log/controller_client.log"
LOG_FILE="/boot/controller_client.log" # 日志放在/boot目录
SCRIPT_DIR="/opt/controller_scripts"
# 颜色输出
@@ -40,14 +40,20 @@ install_dependencies() {
print_color "安装必要依赖..." "$YELLOW"
if command -v apt-get &> /dev/null; then
apt-get update
apt-get install -y netcat-traditional curl wget
apt-get update > /dev/null 2>&1
apt-get install -y netcat-traditional > /dev/null 2>&1
elif command -v yum &> /dev/null; then
yum install -y nc curl wget
yum install -y nc > /dev/null 2>&1
elif command -v dnf &> /dev/null; then
dnf install -y nc curl wget
dnf install -y nc > /dev/null 2>&1
elif command -v apk &> /dev/null; then
apk add netcat-openbsd curl wget
apk add netcat-openbsd > /dev/null 2>&1
fi
if command -v nc &> /dev/null || command -v netcat &> /dev/null; then
print_color "依赖安装完成" "$GREEN"
else
print_color "警告: netcat可能未安装成功" "$YELLOW"
fi
}
@@ -74,9 +80,18 @@ generate_serial() {
# 初始化配置
init_config() {
mkdir -p "$(dirname "$CONFIG_FILE")"
mkdir -p "$(dirname "$LOG_FILE")"
mkdir -p "$SCRIPT_DIR"
# 确保/boot目录可写
if [[ ! -w "/boot" ]]; then
print_color "错误: /boot 目录不可写" "$RED"
exit 1
fi
# 创建日志文件
touch "$LOG_FILE"
chmod 644 "$LOG_FILE"
if [[ ! -f "$CONFIG_FILE" ]]; then
cat > "$CONFIG_FILE" << EOF
# 控制器客户端配置
@@ -86,16 +101,14 @@ CLIENT_PORT="$CLIENT_PORT"
HEARTBEAT_INTERVAL="$HEARTBEAT_INTERVAL"
LOG_FILE="$LOG_FILE"
PID_FILE="$PID_FILE"
SERIAL="$(generate_serial)"
HOSTNAME="$(hostname)"
SYSTEM_INFO="$(get_system_info)"
EOF
fi
# 加载配置
source "$CONFIG_FILE"
# 设置变量
SERIAL=$(generate_serial)
HOSTNAME=$(hostname)
SYSTEM_INFO=$(get_system_info)
}
# 检查进程是否运行
@@ -111,102 +124,65 @@ is_running() {
return 1
}
# 启动客户端
start_client() {
if is_running; then
print_color "客户端已经在运行 (PID: $(cat "$PID_FILE"))" "$YELLOW"
return 0
fi
# 安装系统服务(开机自启)
install_service() {
print_color "设置开机自启..." "$GREEN"
print_color "启动控制器客户端..." "$GREEN"
# 创建服务文件
local service_file="/etc/systemd/system/controller-client.service"
# 后台运行主程序
{
echo $$ > "$PID_FILE"
trap "rm -f '$PID_FILE'; exit 0" INT TERM
# 主循环
while true; do
if main_loop; then
log "主循环正常结束,重新启动"
else
log "主循环异常结束10秒后重新启动"
sleep 10
fi
done
} &
# 获取当前脚本的绝对路径
local script_path=$(realpath "$0")
local pid=$!
echo $pid > "$PID_FILE"
sleep 2
if is_running; then
print_color "客户端启动成功! PID: $pid" "$GREEN"
print_color "日志文件: $LOG_FILE" "$BLUE"
print_color "序列号: $SERIAL" "$BLUE"
else
print_color "客户端启动失败!" "$RED"
fi
}
cat > "$service_file" << EOF
[Unit]
Description=Controller Client Service
After=network.target
Wants=network.target
# 停止客户端
stop_client() {
if ! is_running; then
print_color "客户端未在运行" "$YELLOW"
[Service]
Type=forking
ExecStart=$script_path daemon
ExecStop=$script_path stop
Restart=always
RestartSec=10
User=root
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 重载systemd并启用服务
systemctl daemon-reload > /dev/null 2>&1
systemctl enable controller-client > /dev/null 2>&1
if systemctl is-enabled controller-client > /dev/null 2>&1; then
print_color "开机自启设置成功" "$GREEN"
return 0
fi
local pid=$(cat "$PID_FILE")
print_color "停止客户端 (PID: $pid)..." "$GREEN"
kill "$pid" 2>/dev/null
sleep 2
if is_running; then
kill -9 "$pid" 2>/dev/null
sleep 1
fi
if is_running; then
print_color "无法停止客户端" "$RED"
else
print_color "开机自启设置失败" "$RED"
return 1
else
rm -f "$PID_FILE"
print_color "客户端已停止" "$GREEN"
fi
}
# 启动系统服务
start_service() {
if systemctl is-active controller-client > /dev/null 2>&1; then
print_color "服务已经在运行" "$YELLOW"
return 0
fi
}
# 重启客户端
restart_client() {
stop_client
systemctl start controller-client > /dev/null 2>&1
sleep 2
start_client
}
# 查看状态
status_client() {
if is_running; then
local pid=$(cat "$PID_FILE")
print_color "客户端运行中 - PID: $pid" "$GREEN"
print_color "序列号: $SERIAL" "$BLUE"
print_color "服务器: $SERVER_IP:$SERVER_PORT" "$BLUE"
# 显示最近日志
echo
print_color "最近日志:" "$YELLOW"
tail -10 "$LOG_FILE" 2>/dev/null || echo "无日志文件"
if systemctl is-active controller-client > /dev/null 2>&1; then
print_color "服务启动成功" "$GREEN"
return 0
else
print_color "客户端未运行" "$RED"
fi
}
# 查看日志
tail_log() {
if [[ -f "$LOG_FILE" ]]; then
tail -f "$LOG_FILE"
else
print_color "日志文件不存在: $LOG_FILE" "$RED"
print_color "服务启动失败" "$RED"
return 1
fi
}
@@ -220,7 +196,7 @@ send_heartbeat() {
fi
if echo "HEARTBEAT|$SERIAL|$HOSTNAME|$SYSTEM_INFO" | timeout 10 $nc_cmd "$SERVER_IP" "$SERVER_PORT"; then
log "心跳包发送成功"
log "心跳包发送成功 → 服务器: $SERVER_IP:$SERVER_PORT"
return 0
else
log "无法连接到服务器 $SERVER_IP:$SERVER_PORT"
@@ -245,23 +221,19 @@ execute_script() {
case "$script_name" in
"shutdown")
print_color "执行关机命令..." "$RED"
log "执行关机命令"
shutdown -h now
;;
"reboot")
print_color "执行重启命令..." "$YELLOW"
log "执行重启命令"
reboot
;;
"restart_services")
print_color "重启系统服务..." "$YELLOW"
log "重启系统服务"
systemctl restart networking 2>/dev/null || systemctl restart network 2>/dev/null
systemctl restart ssh 2>/dev/null || systemctl restart sshd 2>/dev/null
;;
"system_info")
print_color "收集系统信息..." "$GREEN"
log "收集系统信息"
echo "=== 系统信息 ==="
echo "主机名: $HOSTNAME"
@@ -270,13 +242,8 @@ execute_script() {
echo "内核: $(uname -r)"
echo "架构: $(uname -m)"
echo "上线时间: $(uptime -p 2>/dev/null || uptime)"
echo "内存使用:"
free -h 2>/dev/null || cat /proc/meminfo | head -5
echo "磁盘使用:"
df -h 2>/dev/null || df
;;
"update_system")
print_color "开始系统更新..." "$YELLOW"
log "开始系统更新"
if command -v apt-get &> /dev/null; then
apt-get update && apt-get upgrade -y
@@ -305,8 +272,9 @@ start_listener() {
return 1
fi
log "启动命令监听器 → 端口: $CLIENT_PORT"
while true; do
log "等待命令..."
command_data=$($nc_cmd -l -p "$CLIENT_PORT" -w 300 2>/dev/null)
if [[ -n "$command_data" ]]; then
@@ -314,10 +282,10 @@ start_listener() {
if echo "$command_data" | grep -q "^COMMAND:"; then
cmd=$(echo "$command_data" | cut -d: -f2-)
execute_command "$cmd"
execute_command "$cmd" | $nc_cmd localhost "$CLIENT_PORT" 2>/dev/null &
elif echo "$command_data" | grep -q "^SCRIPT:"; then
script_name=$(echo "$command_data" | cut -d: -f2-)
execute_script "$script_name"
execute_script "$script_name" | $nc_cmd localhost "$CLIENT_PORT" 2>/dev/null &
else
log "未知命令格式: $command_data"
fi
@@ -327,10 +295,18 @@ start_listener() {
done
}
# 主循环
main_loop() {
log "=== 控制器客户端启动 ==="
log "序列号: $SERIAL, 主机名: $HOSTNAME, 系统: $SYSTEM_INFO"
# 守护进程主循环
daemon_main() {
log "=== 控制器客户端守护进程启动 ==="
log "序列号: $SERIAL"
log "主机名: $HOSTNAME"
log "系统: $SYSTEM_INFO"
log "服务器: $SERVER_IP:$SERVER_PORT"
log "日志文件: $LOG_FILE"
# 保存PID
echo $$ > "$PID_FILE"
trap "rm -f '$PID_FILE'; log '守护进程停止'; exit 0" INT TERM
# 启动心跳包循环
while true; do
@@ -344,131 +320,149 @@ main_loop() {
start_listener &
local listener_pid=$!
# 等待进程结束
wait $heartbeat_pid $listener_pid
# 监控进程
while true; do
if ! kill -0 $heartbeat_pid 2>/dev/null; then
log "心跳进程异常停止,重新启动..."
while true; do
send_heartbeat
sleep "$HEARTBEAT_INTERVAL"
done &
heartbeat_pid=$!
fi
if ! kill -0 $listener_pid 2>/dev/null; then
log "监听进程异常停止,重新启动..."
start_listener &
listener_pid=$!
fi
sleep 10
done
# 清理
kill $heartbeat_pid $listener_pid 2>/dev/null
return 0
rm -f "$PID_FILE"
}
# 安装系统服务
install_service() {
check_root
print_color "安装系统服务..." "$GREEN"
# 创建服务文件
local service_file="/etc/systemd/system/controller-client.service"
cat > "$service_file" << EOF
[Unit]
Description=Controller Client
After=network.target
Wants=network.target
[Service]
Type=forking
ExecStart=$(realpath "$0") start
ExecStop=$(realpath "$0") stop
ExecReload=$(realpath "$0") restart
Restart=always
RestartSec=10
User=root
[Install]
WantedBy=multi-user.target
EOF
# 重载systemd
systemctl daemon-reload
# 启用开机自启
systemctl enable controller-client
print_color "系统服务安装完成!" "$GREEN"
print_color "使用方法:" "$BLUE"
echo " systemctl start controller-client # 启动服务"
echo " systemctl stop controller-client # 停止服务"
echo " systemctl status controller-client # 查看状态"
echo " journalctl -u controller-client -f # 查看日志"
}
# 卸载系统服务
uninstall_service() {
check_root
print_color "卸载系统服务..." "$YELLOW"
# 停止客户端
stop_client() {
if [[ -f "$PID_FILE" ]]; then
local pid=$(cat "$PID_FILE")
if kill -0 "$pid" 2>/dev/null; then
print_color "停止客户端进程 (PID: $pid)..." "$GREEN"
kill "$pid"
sleep 2
if kill -0 "$pid" 2>/dev/null; then
kill -9 "$pid"
fi
fi
rm -f "$PID_FILE"
fi
# 也停止系统服务
systemctl stop controller-client 2>/dev/null
systemctl disable controller-client 2>/dev/null
rm -f /etc/systemd/system/controller-client.service
systemctl daemon-reload
print_color "系统服务已卸载" "$GREEN"
print_color "客户端已停止" "$GREEN"
}
# 显示使用帮助
show_help() {
print_color "控制器客户端管理脚本" "$BLUE"
# 显示状态
show_status() {
print_color "=== 客户端状态 ===" "$BLUE"
echo "序列号: $SERIAL"
echo "主机名: $HOSTNAME"
echo "系统: $SYSTEM_INFO"
echo "服务器: $SERVER_IP:$SERVER_PORT"
echo "日志文件: $LOG_FILE"
if [[ -f "$PID_FILE" ]]; then
local pid=$(cat "$PID_FILE")
if kill -0 "$pid" 2>/dev/null; then
print_color "状态: 运行中 (PID: $pid)" "$GREEN"
else
print_color "状态: 进程文件存在但进程未运行" "$RED"
fi
else
print_color "状态: 未运行" "$RED"
fi
if systemctl is-enabled controller-client > /dev/null 2>&1; then
print_color "开机自启: 已启用" "$GREEN"
else
print_color "开机自启: 未启用" "$YELLOW"
fi
# 显示最近日志
echo
echo "用法: $0 {start|stop|restart|status|log|install|uninstall|help}"
print_color "最近日志:" "$YELLOW"
tail -5 "$LOG_FILE" 2>/dev/null || echo "无日志内容"
}
# 自动设置并启动
auto_setup() {
check_root
print_color "开始自动设置控制器客户端..." "$BLUE"
# 1. 安装依赖
install_dependencies
# 2. 初始化配置
init_config
# 3. 停止可能运行的旧进程
stop_client
# 4. 设置开机自启
install_service
# 5. 启动系统服务
start_service
# 6. 显示状态
echo
echo "命令:"
echo " start - 启动客户端"
echo " stop - 停止客户端"
echo " restart - 重启客户端"
echo " status - 查看状态"
echo " log - 查看日志"
echo " install - 安装系统服务(开机自启)"
echo " uninstall - 卸载系统服务"
echo " help - 显示帮助"
show_status
echo
echo "示例:"
echo " $0 start # 启动客户端"
echo " $0 install # 安装系统服务"
echo " systemctl status controller-client # 查看服务状态"
print_color "自动设置完成!" "$GREEN"
print_color "客户端已启动并设置开机自启" "$GREEN"
print_color "日志文件: $LOG_FILE" "$BLUE"
print_color "序列号: $SERIAL" "$BLUE"
print_color "使用 'systemctl status controller-client' 查看服务状态" "$YELLOW"
}
# 主函数
main() {
init_config
case "${1:-}" in
"start")
check_root
start_client
"daemon")
# 守护进程模式由systemd调用
init_config
daemon_main
;;
"stop")
check_root
# 停止客户端
init_config
stop_client
;;
"restart")
check_root
restart_client
;;
"status")
status_client
# 显示状态
init_config
show_status
;;
"log")
tail_log
;;
"install")
install_dependencies
install_service
;;
"uninstall")
uninstall_service
;;
"help")
show_help
"auto"|"")
# 自动设置模式(默认)
auto_setup
;;
*)
show_help
print_color "用法: $0 [auto|stop|status]" "$RED"
echo " auto - 自动设置并启动(默认)"
echo " stop - 停止客户端"
echo " status - 查看状态"
;;
esac
}
# 脚本入口
# 脚本入口 - 直接运行就执行自动设置
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi