diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4d8232bb..2a7c4b0d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -181,7 +181,7 @@ jobs: fi echo "DIR_NAME=${DIR_NAME}" >> "${GITHUB_ENV}" PKG_VERSION="${{ needs.calculate_version.outputs.version }}" - PKG_VERSION="${PKG_VERSION//-/\~}-1" + PKG_VERSION="${PKG_VERSION//-/\~}" echo "PKG_VERSION=${PKG_VERSION}" >> "${GITHUB_ENV}" - name: Package DEB if: matrix.debian != '' diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 965929df..7393e654 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -120,6 +120,7 @@ jobs: set -xeuo pipefail sudo gem install fpm sudo apt-get install -y debsigs + cp .fpm_systemd .fpm fpm -t deb \ --name "${NAME}" \ -v "$PKG_VERSION" \ @@ -138,6 +139,7 @@ jobs: run: |- set -xeuo pipefail sudo gem install fpm + cp .fpm_systemd .fpm fpm -t rpm \ --name "${NAME}" \ -v "$PKG_VERSION" \ diff --git a/docs/installation/package-manager.md b/docs/installation/package-manager.md index c54eee87..fe59c73a 100644 --- a/docs/installation/package-manager.md +++ b/docs/installation/package-manager.md @@ -8,56 +8,57 @@ icon: material/package === ":material-debian: Debian / APT" - ```bash - sudo mkdir -p /etc/apt/keyrings && - sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc && - sudo chmod a+r /etc/apt/keyrings/sagernet.asc && - echo ' - Types: deb - URIs: https://deb.sagernet.org/ - Suites: * - Components: * - Enabled: yes - Signed-By: /etc/apt/keyrings/sagernet.asc - ' | sudo tee /etc/apt/sources.list.d/sagernet.sources && - sudo apt-get update && - sudo apt-get install sing-box # or sing-box-beta - ``` + ```bash + sudo mkdir -p /etc/apt/keyrings && + sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc && + sudo chmod a+r /etc/apt/keyrings/sagernet.asc && + echo ' + Types: deb + URIs: https://deb.sagernet.org/ + Suites: * + Components: * + Enabled: yes + Signed-By: /etc/apt/keyrings/sagernet.asc + ' | sudo tee /etc/apt/sources.list.d/sagernet.sources && + sudo apt-get update && + sudo apt-get install sing-box # or sing-box-beta + ``` === ":material-redhat: Redhat / DNF 5" - ```bash - sudo dnf config-manager addrepo --from-repofile=https://sing-box.app/sing-box.repo && - sudo dnf install sing-box # or sing-box-beta - ``` + ```bash + sudo dnf config-manager addrepo --from-repofile=https://sing-box.app/sing-box.repo && + sudo dnf install sing-box # or sing-box-beta + ``` === ":material-redhat: Redhat / DNF 4" - ```bash - sudo dnf config-manager --add-repo https://sing-box.app/sing-box.repo && - sudo dnf -y install dnf-plugins-core && - sudo dnf install sing-box # or sing-box-beta - ``` + ```bash + sudo dnf config-manager --add-repo https://sing-box.app/sing-box.repo && + sudo dnf -y install dnf-plugins-core && + sudo dnf install sing-box # or sing-box-beta + ``` ## :material-download-box: Manual Installation - The script download and install the latest package from GitHub releases for deb or rpm based Linux distributions, ArchLinux and OpenWrt. - - ```shell - curl -fsSL https://sing-box.app/install.sh | sh - ``` - - or latest beta: - - ```shell - curl -fsSL https://sing-box.app/install.sh | sh -s -- --beta - ``` - - or specific version: - - ```shell - curl -fsSL https://sing-box.app/install.sh | sh -s -- --version - ``` +The script download and install the latest package from GitHub releases +for deb or rpm based Linux distributions, ArchLinux and OpenWrt. + +```shell +curl -fsSL https://sing-box.app/install.sh | sh +``` + +or latest beta: + +```shell +curl -fsSL https://sing-box.app/install.sh | sh -s -- --beta +``` + +or specific version: + +```shell +curl -fsSL https://sing-box.app/install.sh | sh -s -- --version +``` ## :material-book-lock-open: Managed Installation diff --git a/docs/installation/package-manager.zh.md b/docs/installation/package-manager.zh.md index b59e95cb..60905d1d 100644 --- a/docs/installation/package-manager.zh.md +++ b/docs/installation/package-manager.zh.md @@ -26,39 +26,38 @@ icon: material/package === ":material-redhat: Redhat / DNF 5" - ```bash - sudo dnf config-manager addrepo --from-repofile=https://sing-box.app/sing-box.repo && - sudo dnf install sing-box # or sing-box-beta - ``` + ```bash + sudo dnf config-manager addrepo --from-repofile=https://sing-box.app/sing-box.repo && + sudo dnf install sing-box # or sing-box-beta + ``` === ":material-redhat: Redhat / DNF 4" - ```bash - sudo dnf config-manager --add-repo https://sing-box.app/sing-box.repo && - sudo dnf -y install dnf-plugins-core && - sudo dnf install sing-box # or sing-box-beta - ``` + ```bash + sudo dnf config-manager --add-repo https://sing-box.app/sing-box.repo && + sudo dnf -y install dnf-plugins-core && + sudo dnf install sing-box # or sing-box-beta + ``` ## :material-download-box: 手动安装 -=== ":material-debian: Debian / DEB" +该脚本从 GitHub 发布中下载并安装最新的软件包,适用于基于 deb 或 rpm 的 Linux 发行版、ArchLinux 和 OpenWrt。 - ```bash - bash <(curl -fsSL https://sing-box.app/deb-install.sh) - ``` +```shell +curl -fsSL https://sing-box.app/install.sh | sh +``` -=== ":material-redhat: Redhat / RPM" +或最新测试版: - ```bash - bash <(curl -fsSL https://sing-box.app/rpm-install.sh) - ``` - (这适用于任何使用 `rpm` 和 `systemd` 的发行版。由于 `rpm` 定义依赖关系的方式,如果安装成功,就多半能用。) +```shell +curl -fsSL https://sing-box.app/install.sh | sh -s -- --beta +``` -=== ":simple-archlinux: Archlinux / PKG" +或指定版本: - ```bash - bash <(curl -fsSL https://sing-box.app/arch-install.sh) - ``` +```shell +curl -fsSL https://sing-box.app/install.sh | sh -s -- --version +``` ## :material-book-lock-open: 托管安装 diff --git a/docs/installation/tools/install.sh b/docs/installation/tools/install.sh index e042dde8..74166f02 100755 --- a/docs/installation/tools/install.sh +++ b/docs/installation/tools/install.sh @@ -3,76 +3,92 @@ download_beta=false download_version="" -for arg in "$@"; do - if [[ "$arg" == "--beta" ]]; then - download_beta=true - elif [[ "$arg" == "--version" ]]; then - download_version=true - elif [[ "$download_version" == 'true' ]]; then - download_version="$arg" - else - echo "Unknown argument: $arg" - echo "Usage: $0 [--beta] [--version ]" - exit 1 - fi +while [ $# -gt 0 ]; do + case "$1" in + --beta) + download_beta=true + shift + ;; + --version) + shift + if [ $# -eq 0 ]; then + echo "Missing argument for --version" + echo "Usage: $0 [--beta] [--version ]" + exit 1 + fi + download_version="$1" + shift + ;; + *) + echo "Unknown argument: $1" + echo "Usage: $0 [--beta] [--version ]" + exit 1 + ;; + esac done -if [[ $(command -v dpkg) ]]; then - os="linux" - arch=$(dpkg --print-architecture) - package_suffix=".deb" - package_install="dpkg -i" -elif [[ $(command -v dnf) ]]; then - os="linux" - arch=$(uname -m) - package_suffix=".rpm" - package_install="dnf install -y" -elif [[ $(command -v rpm) ]]; then - os="linux" - arch=$(uname -m) - package_suffix=".rpm" - package_install="rpm -i" -elif [[ $(command -v pacman) ]]; then +if command -v pacman >/dev/null 2>&1; then os="linux" arch=$(uname -m) package_suffix=".pkg.tar.zst" package_install="pacman -U --noconfirm" -elif [[ $(command -v opkg) ]]; then +elif command -v dpkg >/dev/null 2>&1; then + os="linux" + arch=$(dpkg --print-architecture) + package_suffix=".deb" + package_install="dpkg -i" +elif command -v dnf >/dev/null 2>&1; then + os="linux" + arch=$(uname -m) + package_suffix=".rpm" + package_install="dnf install -y" +elif command -v rpm >/dev/null 2>&1; then + os="linux" + arch=$(uname -m) + package_suffix=".rpm" + package_install="rpm -i" +elif command -v opkg >/dev/null 2>&1; then os="openwrt" - source /etc/os-release + . /etc/os-release arch="$OPENWRT_ARCH" package_suffix=".ipk" - package_install="opkg update && opkg install -y" + package_install="opkg update && opkg install" else echo "Missing supported package manager." exit 1 fi -if [[ -z "$download_version" ]]; then - if [[ "$download_beta" != 'true' ]]; then - if [[ -n "$GITHUB_TOKEN" ]]; then - latest_release=$(curl -s --fail-with-body -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/SagerNet/sing-box/releases/latest) +if [ -z "$download_version" ]; then + if [ "$download_beta" != "true" ]; then + if [ -n "$GITHUB_TOKEN" ]; then + latest_release=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/SagerNet/sing-box/releases/latest) else - latest_release=$(curl -s --fail-with-body https://api.github.com/repos/SagerNet/sing-box/releases/latest) + latest_release=$(curl -s https://api.github.com/repos/SagerNet/sing-box/releases/latest) fi curl_exit_status=$? - if [[ $curl_exit_status -ne 0 ]]; then - echo "$latest_release" - exit $? + if [ $curl_exit_status -ne 0 ]; then + exit $curl_exit_status fi - download_version=$(echo "$latest_release" | grep tag_name | cut -d ":" -f2 | sed 's/\"//g;s/\,//g;s/\ //g;s/v//') + if [ "$(echo "$latest_release" | grep tag_name | wc -l)" -eq 0 ]; then + echo "$latest_release" + exit 1 + fi + download_version=$(echo "$latest_release" | grep tag_name | head -n 1 | awk -F: '{print $2}' | sed 's/[", v]//g') else - if [[ -n "$GITHUB_TOKEN" ]]; then - latest_release=$(curl -s --fail-with-body -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/SagerNet/sing-box/releases) + if [ -n "$GITHUB_TOKEN" ]; then + latest_release=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/SagerNet/sing-box/releases) else - latest_release=$(curl -s --fail-with-body https://api.github.com/repos/SagerNet/sing-box/releases) + latest_release=$(curl -s https://api.github.com/repos/SagerNet/sing-box/releases) fi curl_exit_status=$? - if [[ $? -ne 0 ]]; then - echo "$latest_release" - exit $? + if [ $curl_exit_status -ne 0 ]; then + exit $curl_exit_status fi - download_version=$(echo "$latest_release" | grep tag_name | head -n 1 | cut -d ":" -f2 | sed 's/\"//g;s/\,//g;s/\ //g;s/v//') + if [ "$(echo "$latest_release" | grep tag_name | wc -l)" -eq 0 ]; then + echo "$latest_release" + exit 1 + fi + download_version=$(echo "$latest_release" | grep tag_name | head -n 1 | awk -F: '{print $2}' | sed 's/[", v]//g') fi fi @@ -80,18 +96,21 @@ package_name="sing-box_${download_version}_${os}_${arch}${package_suffix}" package_url="https://github.com/SagerNet/sing-box/releases/download/v${download_version}/${package_name}" echo "Downloading $package_url" -if [[ -n "$GITHUB_TOKEN" ]]; then - curl --fail-with-body -Lo "$package_name" -H "Authorization: token ${GITHUB_TOKEN}" "$package_url" +if [ -n "$GITHUB_TOKEN" ]; then + curl --fail -Lo "$package_name" -H "Authorization: token ${GITHUB_TOKEN}" "$package_url" else - curl --fail-with-body -Lo "$package_name" "$package_url" + curl --fail -Lo "$package_name" "$package_url" fi -if [[ $? -ne 0 ]]; then - exit $? +curl_exit_status=$? +if [ $curl_exit_status -ne 0 ]; then + exit $curl_exit_status fi -if [[ $(command -v sudo) ]]; then +if command -v sudo >/dev/null 2>&1; then package_install="sudo $package_install" fi -echo "$package_install $package_name" && $package_install "$package_name" && rm "$package_name" +echo "$package_install $package_name" +sh -c "$package_install \"$package_name\"" +rm -f "$package_name"