#!/usr/bin/env bash set -Eeuo pipefail readonly NEKO_BASE_URL="https://neko.susu.icu" readonly NEKO_PROJECT="NEKO SSH Dashboard" TEMP_DIR="" cleanup() { if [[ -n "${TEMP_DIR:-}" && -d "$TEMP_DIR" ]]; then rm -rf "$TEMP_DIR" fi } fail() { printf '\033[1;31m%s:%s\033[0m\n' "$NEKO_PROJECT" "$*" >&2 exit 1 } info() { printf '\033[1;36m%s\033[0m\n' "$*" } success() { printf '\033[1;32m%s\033[0m\n' "$*" } trap cleanup EXIT HUP INT TERM if [[ "$(uname -s 2>/dev/null)" != "Linux" ]]; then fail "当前仅支持 Linux" fi if [[ ${EUID} -ne 0 ]]; then fail "请使用 sudo 执行安装命令" fi if [[ ! -r /etc/os-release ]]; then fail "无法识别当前 Linux 发行版" fi # shellcheck disable=SC1091 source /etc/os-release if [[ "${ID:-}" != "ubuntu" && "${ID_LIKE:-}" != *ubuntu* ]]; then fail "当前实验版本仅支持 Ubuntu" fi if ! command -v curl >/dev/null 2>&1; then fail "系统缺少 curl,请先执行:sudo apt update && sudo apt install -y curl" fi if ! command -v sha256sum >/dev/null 2>&1; then fail "系统缺少 sha256sum" fi TEMP_DIR="$(mktemp -d -t neko-installer.XXXXXXXX)" readonly INSTALLER_PATH="${TEMP_DIR}/install.sh" readonly CHECKSUM_PATH="${TEMP_DIR}/install.sh.sha256" info "正在获取最新安装程序……" curl \ --fail \ --silent \ --show-error \ --location \ --retry 3 \ --retry-delay 2 \ --connect-timeout 10 \ --max-time 120 \ "${NEKO_BASE_URL}/install.sh" \ --output "$INSTALLER_PATH" curl \ --fail \ --silent \ --show-error \ --location \ --retry 3 \ --retry-delay 2 \ --connect-timeout 10 \ --max-time 30 \ "${NEKO_BASE_URL}/install.sh.sha256" \ --output "$CHECKSUM_PATH" EXPECTED_SHA256="$(awk 'NR == 1 {print $1}' "$CHECKSUM_PATH")" ACTUAL_SHA256="$(sha256sum "$INSTALLER_PATH" | awk '{print $1}')" if [[ ! "$EXPECTED_SHA256" =~ ^[a-fA-F0-9]{64}$ ]]; then fail "校验文件格式无效" fi if [[ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]]; then fail "安装程序完整性校验失败,已停止执行" fi chmod 0700 "$INSTALLER_PATH" success "安装程序校验通过" printf '\n' if [[ ! -r /dev/tty || ! -w /dev/tty ]]; then fail "当前环境没有可用的交互式终端" fi set +e bash "$INSTALLER_PATH" "$@"