Files
shell/proxy/xray.sh
2025-07-16 12:35:21 +00:00

183 lines
4.7 KiB
Bash
Raw Permalink 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.
#!/usr/bin/env bash
# Xray 安装脚本(极简版)
# 固定版本 v1.8.4
# 支持通过 -p 参数设置 GitHub 加速前缀(如 https://gh-proxy.com/
# 仅适用于 Linux 系统,需 root 权限
XRAY_VERSION="v1.8.4"
XRAY_BIN_URL="github.com/XTLS/Xray-core/releases/download/${XRAY_VERSION}/Xray-linux-64.zip"
INSTALL_PATH="/usr/local/bin/xray"
SERVICE_PATH="/etc/systemd/system/xray.service"
CONFIG_PATH="/usr/local/etc/xray/config.json"
# github文件加速前缀
GH_PROXY="https://gh-proxy.com"
show_help() {
echo "用法: $0 [-p <gh-proxy前缀>] [-u|--uninstall]"
echo " -p 可选GitHub 文件加速前缀,如 https://gh-proxy.com"
echo " -u, --uninstall 卸载 Xray 及所有相关文件和服务"
echo "此脚本会自动下载安装 Xray ${XRAY_VERSION},并注册 systemd 服务。"
exit 0
}
# 检查 root 权限
if [[ "$(id -u)" -ne 0 ]]; then
echo "请以 root 用户运行此脚本。"
exit 1
fi
# 解析参数
while [[ $# -gt 0 ]]; do
case "$1" in
-p)
shift
GH_PROXY="$1"
;;
-u|--uninstall)
echo "正在卸载 Xray ..."
systemctl stop xray 2>/dev/null
systemctl disable xray 2>/dev/null
rm -f /usr/local/bin/xray
rm -rf /usr/local/etc/xray
rm -f /etc/systemd/system/xray.service
rm -rf /var/log/xray
systemctl daemon-reload
echo "Xray 及相关文件已卸载。"
exit 0
;;
-h|--help)
show_help
;;
*)
show_help
;;
esac
shift
done
# 自动安装依赖curl 和 unzip
install_pkg() {
PKG_NAME="$1"
if command -v apt >/dev/null 2>&1; then
apt update && apt install -y "$PKG_NAME"
elif command -v dnf >/dev/null 2>&1; then
dnf install -y "$PKG_NAME"
elif command -v yum >/dev/null 2>&1; then
yum install -y "$PKG_NAME"
elif command -v zypper >/dev/null 2>&1; then
zypper install -y "$PKG_NAME"
elif command -v pacman >/dev/null 2>&1; then
pacman -Sy --noconfirm "$PKG_NAME"
elif command -v emerge >/dev/null 2>&1; then
emerge -qv "$PKG_NAME"
else
echo "未检测到支持的包管理器,请手动安装 $PKG_NAME 后重试。"
exit 1
fi
}
for cmd in curl unzip; do
if ! command -v $cmd >/dev/null 2>&1; then
echo "缺少依赖: $cmd,正在尝试自动安装..."
install_pkg "$cmd"
if ! command -v $cmd >/dev/null 2>&1; then
echo "$cmd 安装失败,请手动安装后重试。"
exit 1
fi
fi
done
TMP_DIR="$(mktemp -d)"
ZIP_FILE="$TMP_DIR/xray.zip"
# 拼接加速前缀
if [[ -n "$GH_PROXY" ]]; then
DOWNLOAD_URL="${GH_PROXY%/}/$XRAY_BIN_URL"
else
DOWNLOAD_URL="https://$XRAY_BIN_URL"
fi
echo "下载 Xray: $DOWNLOAD_URL"
curl -L -o "$ZIP_FILE" "$DOWNLOAD_URL"
if [[ $? -ne 0 ]]; then
echo "下载失败,请检查网络或加速前缀。"
rm -rf "$TMP_DIR"
exit 1
fi
unzip -q "$ZIP_FILE" -d "$TMP_DIR"
if [[ $? -ne 0 ]]; then
echo "解压失败。"
rm -rf "$TMP_DIR"
exit 1
fi
install -m 755 "$TMP_DIR/xray" "$INSTALL_PATH"
# 生成 systemd 服务文件(与原脚本一致,自动适配 User 和权限)
INSTALL_USER="root"
if [[ -f '/usr/local/bin/xray' ]]; then
# 若已存在旧服务文件,尝试读取 User 字段
OLD_USER=$(grep '^[ \t]*User[ \t]*=' /etc/systemd/system/xray.service 2>/dev/null | tail -n 1 | awk -F = '{print $2}' | awk '{print $1}')
if [[ -n "$OLD_USER" ]]; then
INSTALL_USER="$OLD_USER"
fi
fi
if ! id "$INSTALL_USER" >/dev/null 2>&1; then
INSTALL_USER="root"
fi
INSTALL_USER_UID=$(id -u "$INSTALL_USER")
# 权限相关字段
temp_CapabilityBoundingSet="CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE"
temp_AmbientCapabilities="AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE"
temp_NoNewPrivileges="NoNewPrivileges=true"
if [[ "$INSTALL_USER_UID" -eq 0 ]]; then
temp_CapabilityBoundingSet="#${temp_CapabilityBoundingSet}"
temp_AmbientCapabilities="#${temp_AmbientCapabilities}"
temp_NoNewPrivileges="#${temp_NoNewPrivileges}"
fi
cat > "$SERVICE_PATH" <<EOF
[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target
[Service]
User=$INSTALL_USER
${temp_CapabilityBoundingSet}
${temp_AmbientCapabilities}
${temp_NoNewPrivileges}
ExecStart=$INSTALL_PATH run -config $CONFIG_PATH
Restart=on-failure
RestartPreventExitStatus=23
LimitNPROC=10000
LimitNOFILE=1000000
[Install]
WantedBy=multi-user.target
EOF
chmod 644 "$SERVICE_PATH"
systemctl daemon-reload
# 生成最简配置文件
mkdir -p "$(dirname $CONFIG_PATH)"
echo '{}' > "$CONFIG_PATH"
# 启动并设置开机自启
systemctl enable xray
systemctl restart xray
sleep 1
if systemctl is-active --quiet xray; then
echo "Xray ${XRAY_VERSION} 安装并启动成功。"
else
echo "Xray 启动失败,请检查日志。"
fi
# 清理临时文件
rm -rf "$TMP_DIR"