├── README.md └── hy2.sh /README.md: -------------------------------------------------------------------------------- 1 | # alpine-hysteria2 2 | 3 | 这是一个用于在 Alpine Linux 系统上自动安装和配置 Hysteria 2 的 Bash 脚本。 4 | 5 | ## 一键安装 6 | 7 | 使用下面的命令一键安装并启动 Hysteria 2: 8 | 9 | ```bash 10 | curl -fsSL https://raw.githubusercontent.com/1TIME1/alpine_hysteria2/main/hy2.sh -o hy2.sh && chmod +x hy2.sh && sh hy2.sh 11 | ``` 12 | 13 | ## 功能特点 14 | 15 | - 自动安装必要的软件包。 16 | - 支持两种 TLS 验证方式: 17 | - 自定义证书(适用于已有证书或 NAT VPS 生成自签名证书)。 18 | - ACME HTTP 验证(需要域名指向本机 IP)。 19 | - 生成随机密码(可选,使用 UUID v4 格式)。 20 | - 获取服务器 IP 地址(支持 IPv4 和 IPv6,优先使用 IPv6)。 21 | - 生成 Hysteria 2 配置文件。 22 | - 下载并配置 Hysteria 2 二进制文件。 23 | - 设置 Hysteria 2 服务随系统启动(使用 OpenRC)。 24 | - 生成 Hysteria 2 订阅链接。 25 | - 提供一键卸载命令。 26 | 27 | ## 使用说明 28 | 29 | 运行脚本后,您将被提示选择 TLS 验证方式并输入相关信息: 30 | 31 | 1. **TLS 验证方式**: 32 | - **1. 自定义证书**:适用于已有证书或 NAT VPS 生成自签名证书。 33 | - **2. ACME HTTP 验证**:需要域名指向本机 IP,且本机 80 端口可被 Hysteria 使用。 34 | 35 | 2. 根据选择的 TLS 验证方式,输入相应的信息: 36 | - **自定义证书**: 37 | - 证书 (.crt) 文件绝对路径(留空则生成自签名证书)。 38 | - 私钥 (.key) 文件绝对路径。 39 | - 用于自签名证书的伪装域名(如果选择生成自签名证书,默认 `www.bing.com`)。 40 | - **ACME HTTP 验证**: 41 | - 您的域名(例如:`example.com`)。 42 | - 用于 ACME 证书申请的邮箱(默认生成随机邮箱,如 `xxxxxxxx@gmail.com`)。 43 | 44 | 3. **端口**:Hysteria 2 监听的端口,默认为 `34567`。 45 | 4. **密码**:用于身份验证的密码。如果不输入,将自动生成一个随机 UUID。 46 | 5. **伪装访问的目标 URL**:用于伪装流量的目标 URL,默认为 `https://www.bing.com`。 47 | 48 | 脚本将自动完成以下操作: 49 | 50 | - 安装必要的软件包。 51 | - 获取服务器 IP 地址(支持 IPv4 和 IPv6,优先使用 IPv6)。 52 | - 根据选择的 TLS 验证方式,生成或使用证书。 53 | - 创建 Hysteria 2 配置文件(位于 `/etc/hysteria/config.yaml`)。 54 | - 下载 Hysteria 2 二进制文件并赋予执行权限。 55 | - 配置 OpenRC 自启动服务。 56 | - 启动 Hysteria 2 服务。 57 | - 生成 Hysteria 2 订阅链接。 58 | 59 | 安装完成后,脚本将输出安装摘要、订阅链接以及管理命令。 60 | 61 | ### 订阅链接 62 | 63 | 脚本会生成一个 Hysteria 2 订阅链接,格式如下: 64 | 65 | ``` 66 | hysteria2://@:/?sni=&alpn=h3&insecure=#Hysteria- 67 | ``` 68 | 69 | - ``:服务器地址(IP 或域名)。 70 | - ``:Hysteria 2 监听的端口。 71 | - ``:身份验证密码。 72 | - ``:TLS 握手时的 SNI(伪装域名)。 73 | - ``:是否允许不安全的 TLS 连接(`0` 或 `1`)。 74 | 75 | 您可以将此链接导入支持 Hysteria 2 的客户端进行使用。 76 | 77 | **注意**:如果使用自定义证书(尤其是自签名证书),客户端通常需要设置 `insecure: true`。 78 | 79 | ## 配置选项 80 | 81 | 脚本使用以下默认值,您可以在运行时选择修改: 82 | 83 | - **端口**:`34567` 84 | - **密码**:随机生成的 UUID(如果未输入) 85 | - **伪装访问的目标 URL**:`https://www.bing.com` 86 | - **伪装域名(自签名证书)**:`www.bing.com` 87 | - **ACME 邮箱**:随机生成的邮箱(如 `xxxxxxxx@gmail.com`,如果选择 ACME HTTP 验证) 88 | 89 | 配置文件位于 `/etc/hysteria/config.yaml`,您可以手动编辑以进行高级配置。 90 | 91 | ## 卸载方法 92 | 93 | 脚本提供了一键卸载命令,用于停止服务、删除自启动配置、移除二进制文件、删除配置文件目录以及删除脚本本身。卸载命令如下: 94 | 95 | ```bash 96 | service hysteria stop ; rc-update del hysteria ; rm /etc/init.d/hysteria ; rm /usr/local/bin/hysteria ; rm -rf /etc/hysteria ; rm hy2.sh 97 | ``` 98 | 99 | ⚠️难民机安装完成后不要speedtest测速,测速必挂。可以用下面指令重启。 100 | 101 | ```bash 102 | service hysteria restart 103 | ``` 104 | 105 | ## 贡献指南 106 | 107 | 如果您有任何改进建议或发现了 bug,欢迎提交 Issue 或 Pull Request。 108 | 109 | ## 许可证 110 | 111 | 本脚本采用 [MIT 许可证](LICENSE) 开源。 112 | 113 | --- 114 | 115 | **注意**:请确保您的服务器环境支持 Alpine Linux 及 OpenRC init 系统。本脚本未在其他 Linux 发行版上测试。 116 | -------------------------------------------------------------------------------- /hy2.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/bash 3 | 4 | # 输出颜色定义 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | YELLOW='\033[0;33m' 8 | NC='\033[0m' # 无颜色 9 | 10 | echo -e "${YELLOW}Hysteria 2 Alpine Linux 安装脚本${NC}" 11 | echo "---------------------------------------" 12 | 13 | # --- 依赖包安装 --- 14 | echo -e "${YELLOW}正在安装必要的软件包...${NC}" >&2 15 | apk update >/dev/null 16 | REQUIRED_PKGS="wget curl git openssl openrc lsof coreutils" 17 | for pkg in $REQUIRED_PKGS; do 18 | if ! apk info -e $pkg &>/dev/null; then 19 | echo "正在安装 $pkg..." >&2 20 | if ! apk add $pkg > /dev/null; then 21 | echo -e "${RED}错误: 安装 $pkg 失败。请手动安装后重试。${NC}" >&2 22 | exit 1 23 | fi 24 | else 25 | echo "$pkg 已安装。" >&2 26 | fi 27 | done 28 | echo -e "${GREEN}依赖包安装成功。${NC}" >&2 29 | 30 | # --- 辅助函数 --- 31 | 32 | # 生成符合RFC 4122标准的UUIDv4函数 33 | generate_uuid() { 34 | local bytes=$(od -x -N 16 /dev/urandom | head -1 | awk '{OFS=""; $1=""; print}') 35 | local byte7=${bytes:12:4} 36 | byte7=$((0x${byte7} & 0x0fff | 0x4000)) 37 | byte7=$(printf "%04x" $byte7) 38 | local byte9=${bytes:20:4} 39 | byte9=$((0x${byte9} & 0x3fff | 0x8000)) 40 | byte9=$(printf "%04x" $byte9) 41 | echo "${bytes:0:8}-${bytes:8:4}-${byte7}-${byte9}-${bytes:24:12}" | tr '[:upper:]' '[:lower:]' 42 | } 43 | 44 | # 生成随机8位小写字母函数 45 | generate_random_lowercase_string() { 46 | LC_ALL=C tr -dc 'a-z' < /dev/urandom | head -c 8 47 | } 48 | 49 | # 获取服务器公网地址并格式化,优先使用IPv6 50 | get_server_address() { 51 | local ipv6_ip 52 | local ipv4_ip 53 | 54 | echo "正在检测服务器公网 IP 地址..." >&2 55 | # 首先尝试获取IPv6地址 56 | echo "尝试获取 IPv6 地址..." >&2 57 | ipv6_ip=$(curl -s -m 5 -6 ifconfig.me || curl -s -m 5 -6 ip.sb || curl -s -m 5 -6 api64.ipify.org) 58 | if [ -n "$ipv6_ip" ] && [[ "$ipv6_ip" == *":"* ]]; then # 检查是否是有效的IPv6地址 59 | echo -e "${GREEN}检测到 IPv6 地址: $ipv6_ip (将优先使用)${NC}" >&2 60 | echo "[$ipv6_ip]" # 这是实际返回给调用者的值,输出到标准输出流 61 | return 62 | else 63 | echo -e "${YELLOW}未检测到 IPv6 地址或获取失败。${NC}" >&2 64 | fi 65 | 66 | # 如果未找到IPv6或获取失败,则尝试获取IPv4地址 67 | echo "尝试获取 IPv4 地址..." >&2 68 | ipv4_ip=$(curl -s -m 5 -4 ifconfig.me || curl -s -m 5 -4 ip.sb || curl -s -m 5 -4 api.ipify.org) 69 | if [ -n "$ipv4_ip" ] && [[ "$ipv4_ip" != *":"* ]]; then # 检查是否是有效的IPv4地址 70 | echo -e "${GREEN}检测到 IPv4 地址: $ipv4_ip${NC}" >&2 71 | echo "$ipv4_ip" 72 | return 73 | else 74 | echo -e "${YELLOW}未检测到 IPv4 地址或获取失败。${NC}" >&2 75 | fi 76 | 77 | echo -e "${RED}错误: 无法获取服务器公网 IP 地址 (IPv4 或 IPv6)。请检查网络连接。${NC}" >&2 78 | exit 1 79 | } 80 | 81 | 82 | # --- 用户输入 --- 83 | DEFAULT_MASQUERADE_URL="https://www.bing.com" # 默认伪装网址 84 | DEFAULT_PORT="34567" 85 | DEFAULT_ACME_EMAIL="$(generate_random_lowercase_string)@gmail.com" # 默认ACME邮箱 86 | 87 | echo "" >&2 88 | echo -e "${YELLOW}请选择 TLS 验证方式:${NC}" >&2 89 | echo "1. 自定义证书 (适用于已有证书或 NAT VPS 生成自签名证书)" >&2 90 | echo "2. ACME HTTP 验证 (需要域名指向本机IP,且本机80端口可被 Hysteria 使用)" >&2 91 | read -p "请选择 [1-2, 默认 1]: " TLS_TYPE 92 | TLS_TYPE=${TLS_TYPE:-1} # 如果用户未输入,则使用默认值1 93 | 94 | # 初始化变量 95 | CERT_PATH="" 96 | KEY_PATH="" 97 | DOMAIN="" 98 | SNI="" 99 | ACME_EMAIL="" # ACME申请证书的邮箱 100 | 101 | case $TLS_TYPE in 102 | 1) # 自定义证书模式 103 | echo -e "${YELLOW}--- 自定义证书模式 ---${NC}" >&2 104 | read -p "请输入证书 (.crt) 文件绝对路径 (回车则生成自签名证书): " USER_CERT_PATH 105 | if [ -z "$USER_CERT_PATH" ]; then # 如果用户未提供证书路径,则生成自签名证书 106 | if ! command -v openssl &> /dev/null; then # 检查openssl命令是否存在 107 | echo -e "${RED}错误: openssl 未安装,请手动运行 'apk add openssl' 后重试${NC}" >&2 108 | exit 1 109 | fi 110 | read -p "请输入用于自签名证书的伪装域名 (默认 www.bing.com): " SELF_SIGN_SNI 111 | SELF_SIGN_SNI=${SELF_SIGN_SNI:-"www.bing.com"} # 默认自签名SNI 112 | SNI="$SELF_SIGN_SNI" 113 | 114 | mkdir -p /etc/hysteria/certs # 创建证书存放目录 115 | CERT_PATH="/etc/hysteria/certs/server.crt" # 自签名证书路径 116 | KEY_PATH="/etc/hysteria/certs/server.key" # 自签名私钥路径 117 | echo "正在生成自签名证书..." >&2 118 | if ! openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) \ 119 | -keyout "$KEY_PATH" -out "$CERT_PATH" \ 120 | -subj "/CN=$SNI" -days 36500; then # 生成自签名证书 121 | echo -e "${RED}错误: 自签名证书生成失败,请检查 openssl 配置!${NC}" >&2 122 | exit 1 123 | fi 124 | echo -e "${GREEN}自签名证书已生成: $CERT_PATH, $KEY_PATH${NC}" >&2 125 | else # 用户提供了证书路径 126 | read -p "请输入私钥 (.key) 文件绝对路径: " USER_KEY_PATH 127 | if [ -z "$USER_CERT_PATH" ] || [ -z "$USER_KEY_PATH" ]; then 128 | echo -e "${RED}错误: 证书和私钥路径都不能为空。${NC}" >&2 129 | exit 1 130 | fi 131 | # 获取文件的绝对路径 132 | CERT_PATH=$(realpath "$USER_CERT_PATH") 133 | KEY_PATH=$(realpath "$USER_KEY_PATH") 134 | 135 | if [ ! -f "$CERT_PATH" ] || [ ! -f "$KEY_PATH" ]; then # 检查文件是否存在 136 | echo -e "${RED}错误: 提供的证书或私钥文件路径无效或文件不存在。${NC}" >&2 137 | exit 1 138 | fi 139 | # 尝试从证书中提取SNI (Common Name) 140 | SNI=$(openssl x509 -noout -subject -in "$CERT_PATH" 2>/dev/null | grep -o 'CN=[^,]*' | cut -d= -f2 | tr -d ' ') 141 | if [ -z "$SNI" ]; then # 如果无法自动提取SNI 142 | read -p "无法从证书自动提取CN(域名),请输入您希望使用的SNI: " MANUAL_SNI 143 | if [ -z "$MANUAL_SNI" ]; then 144 | echo -e "${RED}SNI 不能为空!${NC}" >&2 145 | exit 1 146 | fi 147 | SNI="$MANUAL_SNI" 148 | else 149 | echo "从证书中提取到的 SNI (CN): $SNI" >&2 150 | fi 151 | fi 152 | ;; 153 | 2) # ACME HTTP 验证模式 154 | echo -e "${YELLOW}--- ACME HTTP 验证模式 ---${NC}" >&2 155 | read -p "请输入您的域名 (例如: example.com): " DOMAIN 156 | if [ -z "$DOMAIN" ]; then echo -e "${RED}域名不能为空!${NC}" >&2; exit 1; fi 157 | read -p "请输入用于 ACME 证书申请的邮箱 (回车默认 $DEFAULT_ACME_EMAIL): " INPUT_ACME_EMAIL 158 | ACME_EMAIL=${INPUT_ACME_EMAIL:-$DEFAULT_ACME_EMAIL} # 如果用户未输入,则使用默认ACME邮箱 159 | if [ -z "$ACME_EMAIL" ]; then echo -e "${RED}邮箱不能为空!${NC}" >&2; exit 1; fi # 再次检查,防止默认值生成失败 160 | SNI=$DOMAIN # ACME模式下,SNI与域名相同 161 | 162 | echo "检查 80 端口占用情况..." >&2 163 | if lsof -i:80 -sTCP:LISTEN -P -n &>/dev/null; then # 检查80端口是否被占用 164 | echo -e "${YELLOW}警告: 检测到 80 端口已被占用。Hysteria 将尝试使用此端口进行 ACME 验证。${NC}" >&2 165 | echo "如果 Hysteria 启动失败,请确保没有其他服务 (如nginx, apache) 占用80端口。" >&2 166 | PID_80=$(lsof -t -i:80 -sTCP:LISTEN) # 获取占用80端口的进程ID 167 | [ -n "$PID_80" ] && echo "占用80端口的进程 PID(s): $PID_80" >&2 168 | else 169 | echo "80 端口未被占用,可用于 ACME HTTP 验证。" >&2 170 | fi 171 | # setcap权限将在Hysteria二进制文件下载后设置 172 | ;; 173 | *) # 无效选项 174 | echo -e "${RED}无效选项,退出脚本。${NC}" >&2 175 | exit 1 176 | ;; 177 | esac 178 | 179 | read -p "请输入 Hysteria 端口 (默认 $DEFAULT_PORT): " PORT 180 | PORT=${PORT:-$DEFAULT_PORT} # 如果用户未输入,则使用默认端口 181 | 182 | read -p "请输入 Hysteria 密码 (回车则使用随机UUID): " PASSWORD 183 | if [ -z "$PASSWORD" ]; then 184 | PASSWORD=$(generate_uuid) # 如果用户未输入,则生成随机UUID作为密码 185 | echo "使用随机密码: $PASSWORD" >&2 186 | fi 187 | 188 | read -p "请输入伪装访问的目标URL (默认 $DEFAULT_MASQUERADE_URL): " MASQUERADE_URL 189 | MASQUERADE_URL=${MASQUERADE_URL:-$DEFAULT_MASQUERADE_URL} # 如果用户未输入,则使用默认伪装URL 190 | 191 | SERVER_PUBLIC_ADDRESS=$(get_server_address) # 获取服务器公网IP (优先IPv6) 192 | 193 | mkdir -p /etc/hysteria # 创建Hysteria配置目录 194 | 195 | # --- Hysteria 二进制文件下载与权限设置 --- 196 | HYSTERIA_BIN="/usr/local/bin/hysteria" # Hysteria二进制文件路径 197 | echo -e "${YELLOW}正在下载 Hysteria 最新版...${NC}" >&2 198 | ARCH=$(uname -m) # 获取系统架构 199 | case ${ARCH} in 200 | x86_64) HYSTERIA_ARCH="amd64";; 201 | aarch64) HYSTERIA_ARCH="arm64";; 202 | armv7l) HYSTERIA_ARCH="arm";; # 兼容armv7架构 203 | *) echo -e "${RED}不支持的系统架构: ${ARCH}${NC}" >&2; exit 1;; 204 | esac 205 | 206 | # 下载Hysteria二进制文件 207 | if ! wget -qO "$HYSTERIA_BIN" "https://download.hysteria.network/app/latest/hysteria-linux-${HYSTERIA_ARCH}"; then 208 | echo -e "${RED}下载 Hysteria 失败,请检查网络或手动下载。${NC}" >&2; exit 1 209 | fi 210 | chmod +x "$HYSTERIA_BIN" # 赋予执行权限 211 | echo -e "${GREEN}Hysteria 下载并设置权限完成: $HYSTERIA_BIN${NC}" >&2 212 | 213 | # 如果是ACME HTTP模式,为Hysteria设置绑定低端口(如80)的权限 214 | if [ "$TLS_TYPE" -eq 2 ]; then 215 | echo "为 Hysteria 二进制文件设置 cap_net_bind_service 权限..." >&2 216 | if ! command -v setcap &>/dev/null; then # 检查setcap命令是否存在 217 | echo -e "${YELLOW}setcap 命令未找到,尝试安装 libcap...${NC}" >&2 218 | apk add libcap --no-cache >/dev/null # 安装libcap包 219 | fi 220 | if ! setcap 'cap_net_bind_service=+ep' "$HYSTERIA_BIN"; then # 设置权限 221 | echo -e "${RED}错误: setcap 失败。ACME HTTP 验证可能无法工作。${NC}" >&2 222 | else 223 | echo -e "${GREEN}setcap 成功。${NC}" >&2 224 | fi 225 | fi 226 | 227 | # --- 生成 Hysteria 配置文件 config.yaml --- 228 | echo -e "${YELLOW}正在生成配置文件 /etc/hysteria/config.yaml...${NC}" >&2 229 | cat > /etc/hysteria/config.yaml << EOF 230 | listen: :$PORT # 监听地址和端口 231 | auth: 232 | type: password 233 | password: $PASSWORD # 认证方式及密码 234 | masquerade: 235 | type: proxy 236 | proxy: 237 | url: $MASQUERADE_URL # 伪装配置 238 | rewriteHost: true # 是否重写Host头,通常为true 239 | EOF 240 | 241 | # 根据选择的TLS类型,追加相应的TLS/ACME配置 242 | case $TLS_TYPE in 243 | 1) # 自定义证书 244 | cat >> /etc/hysteria/config.yaml << EOF 245 | tls: 246 | cert: $CERT_PATH # 证书路径 247 | key: $KEY_PATH # 私钥路径 248 | EOF 249 | LINK_SNI="$SNI" # 订阅链接中的SNI 250 | LINK_ADDRESS="$SERVER_PUBLIC_ADDRESS" # 订阅链接中的服务器地址 251 | LINK_INSECURE=1 # 自定义证书(尤其是自签名)通常需要客户端设置insecure=true 252 | echo -e "${YELLOW}注意: 使用自定义证书时,客户端通常需要设置 'insecure: true'${NC}" >&2 253 | ;; 254 | 2) # ACME HTTP 255 | cat >> /etc/hysteria/config.yaml << EOF 256 | acme: 257 | domains: 258 | - $DOMAIN # 申请证书的域名 259 | email: $ACME_EMAIL # 申请证书的邮箱 260 | # Hysteria将自动在80端口处理HTTP-01质询 261 | EOF 262 | LINK_SNI="$DOMAIN"; LINK_ADDRESS="$DOMAIN"; LINK_INSECURE=0 # ACME证书是受信任的 263 | ;; 264 | esac 265 | echo -e "${GREEN}配置文件生成完毕。${NC}" >&2 266 | 267 | # --- 创建 OpenRC 服务文件 --- 268 | echo -e "${YELLOW}正在创建 OpenRC 服务文件 /etc/init.d/hysteria...${NC}" >&2 269 | cat > /etc/init.d/hysteria << EOF 270 | #!/sbin/openrc-run 271 | name="hysteria" # 服务名称 272 | command="/usr/local/bin/hysteria" # Hysteria可执行文件路径 273 | command_args="server --config /etc/hysteria/config.yaml" # Hysteria启动参数 274 | pidfile="/var/run/\${name}.pid" # PID文件路径 275 | command_background="yes" # 后台运行 276 | output_log="/var/log/hysteria.log" # 标准输出日志 277 | error_log="/var/log/hysteria.error.log" # 错误输出日志 278 | 279 | depend() { # 依赖项 280 | need net # 需要网络服务 281 | after firewall # 在防火墙服务之后启动 282 | } 283 | 284 | start_pre() { # 启动前执行的命令 285 | checkpath -f \$output_log -m 0644 # 检查并创建日志文件,设置权限 286 | checkpath -f \$error_log -m 0644 # 检查并创建错误日志文件,设置权限 287 | } 288 | 289 | start() { # 启动服务函数 290 | ebegin "Starting \$name" # 开始启动服务的提示 291 | start-stop-daemon --start --quiet --background \\ 292 | --make-pidfile --pidfile \$pidfile \\ 293 | --stdout \$output_log --stderr \$error_log \\ 294 | --exec \$command -- \$command_args # 启动进程 295 | eend \$? # 结束启动服务的提示,并显示结果 296 | } 297 | 298 | stop() { # 停止服务函数 299 | ebegin "Stopping \$name" # 开始停止服务的提示 300 | start-stop-daemon --stop --quiet --pidfile \$pidfile # 停止进程 301 | eend \$? # 结束停止服务的提示,并显示结果 302 | } 303 | # restart 命令由OpenRC通过调用stop然后start来处理 304 | EOF 305 | chmod +x /etc/init.d/hysteria # 赋予服务文件执行权限 306 | echo -e "${GREEN}OpenRC 服务文件创建成功。${NC}" >&2 307 | 308 | # --- 启用并启动服务 --- 309 | echo -e "${YELLOW}正在启用并启动 Hysteria 服务...${NC}" >&2 310 | rc-update add hysteria default >/dev/null # 将服务添加到默认运行级别 311 | service hysteria stop >/dev/null 2>&1 # 尝试停止任何可能已在运行的实例 312 | if ! service hysteria start; then # 启动服务并检查是否成功 313 | echo -e "${RED}Hysteria 服务启动失败。请检查以下日志获取错误信息:${NC}" >&2 314 | echo " 输出日志: tail -n 20 /var/log/hysteria.log" >&2 315 | echo " 错误日志: tail -n 20 /var/log/hysteria.error.log" >&2 316 | echo " 配置文件: cat /etc/hysteria/config.yaml" >&2 317 | exit 1 318 | fi 319 | echo -e "${GREEN}等待服务启动...${NC}" >&2; sleep 3 # 等待片刻让服务有时间启动和记录日志 320 | 321 | # --- 显示结果 --- 322 | if service hysteria status | grep -q "started"; then # 检查服务状态 323 | echo -e "${GREEN}Hysteria 服务已成功启动!${NC}" 324 | else 325 | echo -e "${RED}Hysteria 服务状态异常。请检查日志:${NC}" 326 | echo " 输出日志: tail -n 20 /var/log/hysteria.log" 327 | echo " 错误日志: tail -n 20 /var/log/hysteria.error.log" 328 | echo " 配置文件: cat /etc/hysteria/config.yaml" 329 | fi 330 | 331 | SUBSCRIPTION_LINK="hysteria2://${PASSWORD}@${LINK_ADDRESS}:${PORT}/?sni=${LINK_SNI}&alpn=h3&insecure=${LINK_INSECURE}#Hysteria-${SNI}" # 生成订阅链接 332 | 333 | echo "" # 输出空行,用于格式化 334 | echo "------------------------------------------------------------------------" 335 | echo -e "${GREEN}Hysteria 2 安装和配置完成!${NC}" 336 | echo "------------------------------------------------------------------------" 337 | echo "服务器地址 (用于客户端配置): $LINK_ADDRESS" 338 | echo "端口: $PORT" 339 | echo "密码: $PASSWORD" 340 | echo "SNI / 伪装域名: $LINK_SNI" 341 | echo "伪装目标站点: $MASQUERADE_URL" 342 | echo "TLS 模式: $TLS_TYPE (1:Custom, 2:ACME-HTTP)" 343 | if [ "$TLS_TYPE" -eq 1 ]; then 344 | echo "证书路径: $CERT_PATH; 私钥路径: $KEY_PATH" # 如果是自定义证书模式,显示证书路径 345 | elif [ "$TLS_TYPE" -eq 2 ]; then 346 | echo "ACME 邮箱: $ACME_EMAIL" # 如果是ACME模式,显示使用的邮箱 347 | fi 348 | echo "客户端 insecure (0=false, 1=true): $LINK_INSECURE" 349 | echo "------------------------------------------------------------------------" 350 | echo -e "${YELLOW}订阅链接 (Hysteria V2):${NC}" 351 | echo "$SUBSCRIPTION_LINK" # 输出订阅链接 352 | echo "------------------------------------------------------------------------" 353 | 354 | # 可选:显示二维码 355 | if command -v qrencode &> /dev/null; then # 检查qrencode命令是否存在 356 | echo -e "${YELLOW}订阅链接二维码:${NC}" 357 | qrencode -t ANSIUTF8 "$SUBSCRIPTION_LINK" # 生成并显示二维码 358 | else 359 | echo -e "${YELLOW}提示: 安装 'qrencode' (apk add qrencode) 后可显示二维码。${NC}" 360 | fi 361 | echo "------------------------------------------------------------------------" 362 | echo "管理命令:" 363 | echo " service hysteria start - 启动服务" 364 | echo " service hysteria stop - 停止服务" 365 | echo " service hysteria restart - 重启服务" 366 | echo " service hysteria status - 查看状态" 367 | echo " cat /etc/hysteria/config.yaml - 查看配置文件" 368 | echo " tail -f /var/log/hysteria.log - 查看实时日志" 369 | echo " tail -f /var/log/hysteria.error.log - 查看实时错误日志" 370 | echo "一键卸载命令:" 371 | echo " service hysteria stop ; rc-update del hysteria ; rm /etc/init.d/hysteria ; rm /usr/local/bin/hysteria ; rm -rf /etc/hysteria ; rm hy2.sh" 372 | echo "------------------------------------------------------------------------" 373 | --------------------------------------------------------------------------------