Files
dock/02
2025-11-05 21:38:36 +08:00

292 lines
8.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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