从零开始创建一个功能完善的 Surge Snell 服务器一键安装脚本。这个过程将深入理解脚本的每一个细节,并最终获得一个你可以自定义和维护的脚本。
这个脚本将实现以下目标:
- 自动化: 无需手动输入命令,运行一个文件即可完成所有操作。
- 智能化: 自动检测服务器的 CPU 架构,下载正确的 Snell 版本。
- 安全性: 自动生成随机的端口和预共享密钥 (PSK)。
- 稳定性: 创建 systemd 服务,确保 Snell 能开机自启并由系统管理。
- 用户友好: 提供清晰的安装指示和最终的配置信息。
准备工作
在开始编写脚本之前,需要:
- 一台位于境外的 Linux 服务器 (推荐 Debian, Ubuntu 或 CentOS)。
- 使用 SSH 客户端(如 Terminal, PowerShell, PuTTY)登录到你的服务器。
- 一个文本编辑器来编写脚本。你可以直接在服务器上使用 vim 或 nano,也可以在本地电脑上写好再上传。
脚本创建步骤
我们将把整个过程分解为几个核心的编程步骤。
第一步:创建脚本文件和设置基础结构
首先,让我们创建一个脚本文件并写入一些基础内容。
- 登录到你的服务器。
- 创建一个名为 install_snell.sh 的文件:
touch install_snell.sh - 使用你喜欢的编辑器打开它,例如 nano:
nano install_snell.sh 在脚本的开头,写入 "Shebang",它告诉系统这个文件应该由哪个解释器来执行。对于 shell 脚本,通常是 /bin/bash。同时,添加一些注释来说明脚本的用途。
/bin/bash
=========================
System Required: Debian/Ubuntu/CentOS
Description: One-click script for Snell Server
Version: 1.0
Author: Your Name
=========================
设置颜色,让输出更好看
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
第二步:检查运行环境和权限
一个好的脚本应该在开始时就检查是否满足运行条件。
检查Root权限: 大部分安装操作都需要 root 权限。我们可以通过检查用户 ID ($EUID) 是否为 0 来判断。
在脚本中加入以下代码:# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}错误:本脚本需要以 root 权限运行!${NC}"
exit 1
fi
安装必要的工具: 脚本需要 curl 来下载文件,unzip 来解压文件。我们需要确保它们已经被安装。
# 安装依赖
echo "正在检查并安装必要的工具 (curl, unzip)..."
if ! command -v curl &> /dev/null || ! command -v unzip &> /dev/null; then
apt-get update && apt-get install -y curl unzip || yum install -y curl unzip
fi
echo -e "${GREEN}工具检查完毕。${NC}"
- command -v 用来检查命令是否存在。
- apt-get 是 Debian/Ubuntu 的包管理器,yum 是 CentOS 的。|| 表示如果前者失败,则执行后者。
第三步:检测系统架构并下载 Snell
Snell 服务器针对不同的 CPU 架构有不同的二进制文件(例如 amd64, arm64)。脚本必须能自动识别并下载正确的版本。 定义变量和检测架构:
# 定义 Snell 版本和下载基础 URL
SNELL_VERSION="4.0.1" # 你可以随时更新到最新版本
BASE_URL="[https://dl.nssurge.com/snell/snell-server-v${SNELL_VERSION}](https://dl.nssurge.com/snell/snell-server-v$%7BSNELL_VERSION%7D)"
检测系统架构
ARCH=$(uname -m)
case ${ARCH} in
x86_64|amd64)
SNELL_ARCH="amd64"
;;
aarch64|arm64)
SNELL_ARCH="aarch64"
;;
*)
echo -e "${RED}错误:不支持的系统架构: ${ARCH}${NC}"
exit 1
;;
esac
echo "检测到系统架构为: ${GREEN}${SNELL_ARCH}${NC}"
下载并解压文件:
# 拼接下载链接并下载
DOWNLOAD_URL="${BASE_URL}-linux-${SNELL_ARCH}.zip"
echo "正在从 ${DOWNLOAD_URL} 下载 Snell Server..."
创建一个临时目录来处理文件
TEMP_DIR=$(mktemp -d)
curl -L -o "${TEMP_DIR}/snell.zip" "${DOWNLOAD_URL}"
解压文件
unzip -o "${TEMP_DIR}/snell.zip" -d /usr/local/bin/
chmod +x /usr/local/bin/snell-server
清理临时文件
rm -rf "${TEMP_DIR}"
echo -e "${GREEN}Snell Server 下载并安装成功!${NC}"
- mktemp -d 创建一个安全的临时目录。
- o 指定 curl 的输出文件。
- unzip -o 表示覆盖现有文件,-d 指定解压目录。
- chmod +x 赋予文件可执行权限。
第四步:生成配置文件
现在,我们需要为 Snell 创建一个配置文件,包含监听端口和密钥。 生成随机参数:
# 生成随机端口 (10000-65535)
PORT=$((RANDOM % 55536 + 10000))
生成随机 PSK (32位)
PSK=$(tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 | head -n 1)
创建配置文件目录和文件:
# 创建配置文件目录
mkdir -p /etc/snell
写入配置
cat > /etc/snell/snell-server.conf <<EOF
[snell-server]
listen = 0.0.0.0:${PORT}
psk = ${PSK}
ipv6 = true
EOF
echo -e "${GREEN}Snell 配置文件创建成功!(/etc/snell/snell-server.conf)${NC}"
- cat > ... <<EOF 是一种 here-document 语法,可以方便地将多行文本写入文件。
第五步:创建并启动 Systemd 服务
为了让 Snell 能在后台稳定运行并开机自启,我们需要为它创建一个 systemd 服务。 创建服务文件:
# 创建 systemd 服务文件
cat > /etc/systemd/system/snell.service <<EOF
[Unit]
Description=Snell Proxy Service
After=network.target
[Service]
Type=simple
User=nobody
Group=nogroup
LimitNOFILE=32768
ExecStart=/usr/local/bin/snell-server -c /etc/snell/snell-server.conf
[Install]
WantedBy=multi-user.target
EOF
echo -e "${GREEN}Systemd 服务文件创建成功!${NC}"
- User=nobody 和 Group=nogroup 是为了以低权限用户运行服务,增加安全性。
- ExecStart 定义了启动服务的命令。
启动服务:
# 重新加载 systemd 配置并启动 snell 服务
systemctl daemon-reload
systemctl enable snell
systemctl start snell
echo -e "${GREEN}Snell 服务已启动并设置为开机自启!${NC}"
第六步:显示配置信息
最后,也是最重要的一步,向用户展示连接所需的所有信息。
获取服务器 IP:
# 获取服务器公网 IP
SERVER_IP=$(curl -s ip.sb)
打印最终配置:
# 清屏并显示最终配置
clear
echo "=============================="
echo -e "${GREEN}Snell 服务器安装成功!${NC}"
echo "=============================="
echo ""
echo -e "请在 Surge 中添加以下配置:"
echo ""
echo -e "${GREEN}MySnell = snell, ${SERVER_IP}, ${PORT}, psk=${PSK}, version=4${NC}"
echo ""
echo "===============================
完整脚本
将以上所有步骤组合在一起,你就得到了一个完整的 install_snell.sh 脚本。你可以将它保存,然后通过以下命令赋予执行权限并运行:
chmod +x install_snell.sh
./install_snell.sh