#!/bin/bash # Check if script is run as root if [ "$EUID" -ne 0 ]; then echo "Please run as root" exit 1 fi # Install bc based on system package manager if command -v apt-get > /dev/null; then apt-get update && apt-get install -y bc elif command -v yum > /dev/null; then yum update -y && yum install -y bc else echo "Could not install bc. Please install it manually." exit 1 fi # Stop existing service if running systemctl stop ak_client # Function to detect main network interface get_main_interface() { local interfaces=$(ip -o link show | \ awk -F': ' '$2 !~ /^((lo|docker|veth|br-|virbr|tun|vnet|wg|vmbr|dummy|gre|sit|vlan|lxc|lxd|warp|tap))/{print $2}' | \ grep -v '@') local interface_count=$(echo "$interfaces" | wc -l) # 格式化流量大小的函数 format_bytes() { local bytes=$1 if [ $bytes -lt 1024 ]; then echo "${bytes} B" elif [ $bytes -lt 1048576 ]; then # 1024*1024 echo "$(echo "scale=2; $bytes/1024" | bc) KB" elif [ $bytes -lt 1048576 ]; then # 1024*1024 echo "$(echo "scale=2; $bytes/1024" | bc) KB" elif [ $bytes -lt 1073741824 ]; then # 1024*1024*1024 echo "$(echo "scale=2; $bytes/1024/1024" | bc) MB" elif [ $bytes -lt 1099511627776 ]; then # 1024*1024*1024*1024 echo "$(echo "scale=2; $bytes/1024/1024/1024" | bc) GB" else echo "$(echo "scale=2; $bytes/1024/1024/1024/1024" | bc) TB" fi } # 显示网卡流量的函数 show_interface_traffic() { local interface=$1 if [ -d "/sys/class/net/$interface" ]; then local rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) local tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) echo " ↓ Received: $(format_bytes $rx_bytes)" echo " ↑ Sent: $(format_bytes $tx_bytes)" else echo " 无法读取流量信息" fi } # 如果没有找到合适的接口或有多个接口时显示所有可用接口 echo "所有可用的网卡接口:" >&2 echo "------------------------" >&2 local i=1 while read -r interface; do echo "$i) $interface" >&2 show_interface_traffic "$interface" >&2 i=$((i+1)) done < <(ip -o link show | grep -v "lo:" | awk -F': ' '{print $2}') echo "------------------------" >&2 while true; do read -p "请选择网卡,如上方显示异常或没有需要的网卡,请直接填入网卡名: " selection # 检查是否为数字 if [[ "$selection" =~ ^[0-9]+$ ]]; then # 如果是数字,检查是否在有效范围内 selected_interface=$(ip -o link show | grep -v "lo:" | sed -n "${selection}p" | awk -F': ' '{print $2}') if [ -n "$selected_interface" ]; then echo "已选择网卡: $selected_interface" >&2 echo "$selected_interface" break else echo "无效的选择,请重新输入" >&2 continue fi else # 直接使用输入的网卡名 echo "已选择网卡: $selection" >&2 echo "$selection" break fi done } # Check if all arguments are provided if [ "$#" -ne 3 ]; then echo "Usage: $0 " echo "Example: $0 your_secret wss://api.123.321 HK-Akile" exit 1 fi # Get system architecture ARCH=$(uname -m) CLIENT_FILE="akile_client-linux-amd64" # Set appropriate client file based on architecture if [ "$ARCH" = "x86_64" ]; then CLIENT_FILE="akile_client-linux-amd64" elif [ "$ARCH" = "aarch64" ]; then CLIENT_FILE="akile_client-linux-arm64" elif [ "$ARCH" = "x86_64" ] && [ "$(uname -s)" = "Darwin" ]; then CLIENT_FILE="akile_client-darwin-amd64" else echo "Unsupported architecture: $ARCH" exit 1 fi # Assign command line arguments to variables auth_secret="$1" url="$2" monitor_name="$3" # Get network interface net_name=$(get_main_interface) echo "Using network interface: $net_name" # Create directory and change to it mkdir -p /etc/ak_monitor/ cd /etc/ak_monitor/ # Download client wget -O client https://github.com/akile-network/akile_monitor/releases/latest/download/$CLIENT_FILE chmod 777 client # Create systemd service file cat > /etc/systemd/system/ak_client.service << 'EOF' [Unit] Description=AkileCloud Monitor Service After=network.target nss-lookup.target Wants=network.target [Service] User=root Group=root Type=simple LimitAS=infinity LimitRSS=infinity LimitCORE=infinity LimitNOFILE=999999999 WorkingDirectory=/etc/ak_monitor/ ExecStart=/etc/ak_monitor/client Restart=always RestartSec=1 [Install] WantedBy=multi-user.target EOF # Create client configuration cat > /etc/ak_monitor/client.json << EOF { "auth_secret": "${auth_secret}", "url": "${url}", "net_name": "${net_name}", "name": "${monitor_name}" } EOF # Set proper permissions chmod 644 /etc/ak_monitor/client.json chmod 644 /etc/systemd/system/ak_client.service # Reload systemd and enable service systemctl daemon-reload systemctl enable ak_client.service systemctl start ak_client.service echo "Installation complete! Service status:" systemctl status ak_client.service