#!/usr/bin/env bash set -e # 必须 root if [[ "$EUID" -ne 0 ]]; then echo "❌ 请使用 root 或在前面加 sudo 再运行这个脚本。" exit 1 fi echo "=== 网卡上行限速一键安装脚本 (Debian/Ubuntu 通用) ===" echo # 自动检测默认出口网卡 detect_iface() { local dev dev=$(ip route get 1.1.1.1 2>/dev/null | awk '{for (i=1;i<=NF;i++) if ($i=="dev") {print $(i+1); exit}}') if [[ -z "$dev" ]]; then dev=$(ip route 2>/dev/null | awk '/default/ {print $5; exit}') fi echo "$dev" } DEFAULT_IFACE="$(detect_iface)" if [[ -z "$DEFAULT_IFACE" ]]; then echo "⚠ 未能自动检测到默认网卡,请手动输入。" fi echo "检测到的默认出口网卡: ${DEFAULT_IFACE:-<未检测到>}" # 【核心修改点】添加 < /dev/tty 以支持 curl 管道运行时的交互 read -rp "请输入需要限速的网卡名 [${DEFAULT_IFACE}]: " IFACE < /dev/tty IFACE="${IFACE:-$DEFAULT_IFACE}" if [[ -z "$IFACE" ]]; then echo "❌ 未指定网卡名,退出。" exit 1 fi # 校验网卡是否存在 if ! ip link show "$IFACE" &>/dev/null; then echo "❌ 网卡 $IFACE 不存在,请确认后重试。" exit 1 fi echo # 【核心修改点】添加 < /dev/tty read -rp "请输入上行限速(单位 M,直接回车 = 1000M): " RATE_M < /dev/tty RATE_M="${RATE_M//[!0-9]/}" # 只保留数字 if [[ -z "$RATE_M" ]]; then RATE_M=1000 fi if [[ "$RATE_M" -le 0 ]]; then echo "❌ 限速值必须是大于 0 的数字(单位 M)。" exit 1 fi RATE="${RATE_M}mbit" echo echo "====== 配置确认 ======" echo " 网卡: $IFACE" echo " 上行: $RATE_M M (=$RATE)" echo " 模式: 整个网卡上行总带宽限速" echo "=======================" # 【核心修改点】添加 < /dev/tty read -rp "确认执行?[Y/n]: " CONFIRM < /dev/tty CONFIRM=${CONFIRM:-Y} if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then echo "已取消。" exit 0 fi # 找到 tc 路径 TC_BIN="$(command -v tc || echo /sbin/tc)" if [[ ! -x "$TC_BIN" ]]; then echo "❌ 未找到 tc 命令,请确认 iproute2 已安装。" echo " 可以执行: apt update && apt install -y iproute2" exit 1 fi SERVICE_NAME="netlimit-${IFACE}.service" SERVICE_PATH="/etc/systemd/system/${SERVICE_NAME}" echo echo "➡ 正在写入 systemd 服务:${SERVICE_PATH}" cat > "${SERVICE_PATH}" <