#!/bin/bash # 无依赖客户端脚本 - 使用系统自带工具 # 支持: Debian, Ubuntu, CentOS, RHEL, Fedora, Alpine SERVER_IP="159.138.58.239" # 你的服务器IP SERVER_PORT=5555 CLIENT_PORT=5556 HEARTBEAT_INTERVAL=30 # 获取系统信息 get_system_info() { if [[ -f /etc/os-release ]]; then local distro=$(grep -oP '(?<=^ID=).+' /etc/os-release | tr -d '"') local version=$(grep -oP '(?<=^VERSION_ID=).+' /etc/os-release | tr -d '"') echo "$distro $version" else echo "unknown" fi } # 生成客户端序列号 generate_serial() { if [[ -f /etc/machine-id ]]; then cat /etc/machine-id | md5sum | cut -c1-8 else date +%s | sha256sum | base64 | head -c 8 fi } SERIAL=$(generate_serial) HOSTNAME=$(hostname) SYSTEM_INFO=$(get_system_info) # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "$(date '+%Y-%m-%d %H:%M:%S') - $1" } print_color() { echo -e "${2}${1}${NC}" } # 检查可用工具 check_tool() { for tool in "$@"; do if command -v "$tool" &> /dev/null; then echo "$tool" return 0 fi done echo "" } # 发送数据到服务器 send_data() { local data="$1" local port="$2" # 尝试多种方法发送数据 local tool=$(check_tool nc netcat telnet) if [[ -n "$tool" ]]; then # 使用netcat或telnet if [[ "$tool" == "telnet" ]]; then echo "$data" | timeout 5 telnet "$SERVER_IP" "$port" 2>/dev/null else echo "$data" | timeout 5 "$tool" "$SERVER_IP" "$port" 2>/dev/null fi elif command -v bash &> /dev/null && command -v cat &> /dev/null; then # 使用bash内置的TCP功能 exec 3<>/dev/tcp/$SERVER_IP/$port 2>/dev/null if [[ $? -eq 0 ]]; then echo "$data" >&3 cat <&3 2>/dev/null & sleep 1 exec 3>&- return 0 fi elif command -v /bin/echo &> /dev/null && [[ -e /dev/tcp ]]; then # 另一种TCP方法 /bin/echo "$data" > /dev/tcp/$SERVER_IP/$port 2>/dev/null & fi return 1 } # 监听端口 listen_port() { local port="$1" # 尝试多种监听方法 local tool=$(check_tool nc netcat) if [[ -n "$tool" ]]; then # 使用netcat监听 $tool -l -p "$port" -c 'read -r data; echo "$data"' elif command -v bash &> /dev/null; then # 使用bash监听(简单版本) while true; do { while read -r line; do echo "$line" break done } < /dev/tcp/0.0.0.0/"$port" 2>/dev/null || sleep 1 done else # 最后的方法:使用临时文件轮询 local temp_file="/tmp/client_cmd_$$" while true; do if [[ -f "$temp_file" ]]; then cat "$temp_file" rm -f "$temp_file" fi sleep 1 done fi } # 发送心跳包 send_heartbeat() { while true; do if send_data "HEARTBEAT|$SERIAL|$HOSTNAME|$SYSTEM_INFO" "$SERVER_PORT"; then log "心跳包发送成功" else print_color "无法连接到服务器 $SERVER_IP:$SERVER_PORT" "$RED" print_color "将在 ${HEARTBEAT_INTERVAL} 秒后重试..." "$YELLOW" fi sleep $HEARTBEAT_INTERVAL done } # 执行命令 execute_command() { local command="$1" log "执行命令: $command" # 执行命令并捕获输出 result=$(eval "$command" 2>&1) echo "命令执行结果: $result" } # 执行预定义脚本 execute_script() { local script_name="$1" case "$script_name" in "shutdown") print_color "执行关机命令..." "$RED" shutdown -h now ;; "reboot") print_color "执行重启命令..." "$YELLOW" reboot ;; "restart_services") print_color "重启系统服务..." "$YELLOW" 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" echo "=== 系统信息 ===" echo "主机名: $(hostname)" echo "序列号: $SERIAL" echo "系统: $SYSTEM_INFO" 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" if command -v apt-get &> /dev/null; then apt-get update && apt-get upgrade -y elif command -v yum &> /dev/null; then yum update -y elif command -v dnf &> /dev/null; then dnf update -y elif command -v apk &> /dev/null; then apk update && apk upgrade else echo "未找到包管理器" fi echo "系统更新完成!" ;; "network_info") print_color "网络信息..." "$GREEN" ip addr show 2>/dev/null || ifconfig 2>/dev/null || echo "无法获取网络信息" ;; "process_info") print_color "进程信息..." "$GREEN" ps aux 2>/dev/null | head -20 ;; *) print_color "未知命令: $script_name" "$RED" echo "可用命令: shutdown, reboot, restart_services, system_info, update_system, network_info, process_info" ;; esac } # 启动命令监听 start_listener() { print_color "启动命令监听器在端口 $CLIENT_PORT..." "$GREEN" print_color "客户端信息: $SERIAL - $HOSTNAME - $SYSTEM_INFO" "$BLUE" print_color "使用通信方法: $(check_tool nc netcat || echo "bash TCP")" "$BLUE" while true; do log "等待命令..." command_data=$(listen_port "$CLIENT_PORT") if [[ -n "$command_data" ]]; then log "收到命令: $command_data" if echo "$command_data" | grep -q "^COMMAND:"; then cmd=$(echo "$command_data" | cut -d: -f2-) echo "执行命令: $cmd" execute_command "$cmd" elif echo "$command_data" | grep -q "^SCRIPT:"; then script_name=$(echo "$command_data" | cut -d: -f2-) echo "执行脚本: $script_name" execute_script "$script_name" else echo "未知命令格式: $command_data" fi fi sleep 1 done } # 清理函数 cleanup() { print_color "客户端停止" "$RED" exit 0 } # 设置信号处理 trap cleanup INT TERM # 主函数 main() { print_color "=== 无依赖控制器客户端 ===" "$BLUE" print_color "序列号: $SERIAL" "$GREEN" print_color "主机名: $HOSTNAME" "$GREEN" print_color "系统: $SYSTEM_INFO" "$GREEN" print_color "服务器: $SERVER_IP:$SERVER_PORT" "$BLUE" # 显示可用工具 print_color "检测到以下通信工具:" "$YELLOW" for tool in nc netcat telnet bash; do if command -v "$tool" &> /dev/null; then echo " ✓ $tool" fi done # 启动心跳包发送(后台进程) print_color "启动心跳服务..." "$GREEN" send_heartbeat & # 启动命令监听 print_color "启动命令监听..." "$GREEN" start_listener } # 脚本入口 case "${1:-}" in "execute_script") execute_script "$2" ;; "heartbeat") send_heartbeat ;; "test") echo "测试连接到服务器..." send_data "TEST|$SERIAL" "$SERVER_PORT" ;; *) main ;; esac