Paru的增强下载脚本Paria

ArchLinux是一款备受推崇的Linux发行版,以其滚动更新机制、最新软件包支持和高度可定制性而闻名。然而,在使用Paru从AUR(Arch User Repository)安装软件时,很多用户遇到了因依赖于GitHub上的资源无法访问而导致的问题。为了解决这一挑战,我最初开发了名为“ ParuAxel.sh ”的脚本,以帮助用户更顺畅地安装软件。

随着进一步的优化升级,我决定采用更为高效的多线程下载工具Aria2,并对脚本进行了全面改进。为了更好地反映这些变化,我将这个新版本的脚本重命名为“Paria.sh”。通过使用Aria2,“ Paria.sh ”不仅解决了由于网络限制导致的GitHub资源访问问题,还大幅提升了下载速度与稳定性,为用户提供了一个更加流畅可靠的软件包管理体验。

“Paria.sh”专注于增强ArchLinux用户的AUR软件安装过程,使得即使面对复杂的依赖关系或网络波动,也能轻松完成软件的下载与安装。它体现了我对提升用户体验的持续努力,旨在让每一位ArchLinux用户都能享受更加高效便捷的软件管理过程。

Paria.sh脚本及其配置

{% tabs Paria %}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#! /bin/sh
#
# Program: Paria.sh
# Version: V2.0
# Author : Zhen-Hua Feng
# Email  : fengzhenhua@outlook.com
# Date   : 2025-03-24 11:45
# Copyright (C) 2023-2025 feng <feng@arch>
#
# Distributed under terms of the MIT license.
#
GIT_DOMIN=`echo "$2" | cut -f3 -d'/'`;
GIT_OTHER=`echo "$2" | cut -f4- -d'/'`;
GIT_INIT="https://github.com/"
DNS_SERVERS="1.0.0.1,1.0.0.2,1.0.0.3"
GCF=/home/$USER/.gitconfig
GIT_SIT=($(grep -oP '\[url\s+"\Khttps://[^"]+' $GCF))
mirror_available() {
    local url="$1"
    if curl -fsL --max-time 5 --head "$url" >/dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}
case "$GIT_DOMIN" in
    "github.com")
        GIT_URL="$2"
        echo "Download from mirror $GIT_URL";
        /usr/bin/aria2c --async-dns-server="$DNS_SERVERS" --split=12 --max-connection-per-server=15 -k 1M --auto-file-renaming=false -o "$1" "$GIT_URL" ;
        if [[ $? -ne 0 ]]; then
            echo "[WARN] GitHub 原始地址下载失败,启动镜像检测..."
            if [ -e $GCF ]; then
                GIT_SIT=($(grep -oP '\[url\s+"\Khttps://[^"]+' $GCF))
                for mirror in "${GIT_SIT[@]}"; do
                    if [[ "${mirror}" =~ "/$" ]]; then
                        GIT_URL="${mirror}${GIT_PATH}"
                    else
                        GIT_URL="${mirror}/${GIT_PATH}"
                    fi
                    if mirror_available "${GIT_URL}"; then
                        /usr/bin/aria2c --split=12 --max-connection-per-server=15 -k 1M --auto-file-renaming=false -o "$1" "$GIT_URL" ;
                        if [[ $? -eq 0 ]]; then
                            exit 0  # 下载成功则退出
                        else
                            echo "[ERROR] 镜像下载失败: $GIT_URL (状态码: $?)" >&2
                        fi
                    fi
                done
            fi
            # 所有镜像失败后直接退出(不回退 GitHub)
            echo "[FATAL] 所有下载尝试失败,请检查网络或镜像配置"
            exit 1
        fi
        ;;
    *)
        /usr/bin/aria2c --split=12 --max-connection-per-server=15 -k 1M --auto-file-renaming=false -o "$1" "$2" ;
        ;;
esac
1
2
3
4
5
6
DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
          'ftp::/usr/bin/aria2c -s 15 -x 15 -k 1M --auto-file-renaming=false -o %o %u'
          'http::/usr/bin/aria2c -s 15 -x 15 -k 1M --auto-file-renaming=false -o %o %u'
          'https::/usr/bin/Paria %o %u'
          'rsync::/usr/bin/rsync --no-motd -z %u %o'
          'scp::/usr/bin/scp -C %u %o')
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#! /bin/sh
#
# 项目:install.sh
# 版本:V1.4
# Copyright (C) 2023 feng <feng@arch>
# Distributed under terms of the MIT license.
#
sudo pacman -S --needed --noconfirm aria &> /dev/null
sudo cp ./makepkg.conf /etc/makepkg.conf
sudo cp ./Paria.sh  /usr/bin/Paria
sudo chmod 755 /usr/bin/Paria
echo "Paria 安装成功,paru配置完毕 !! "
exit

{% endtabs %}

{% note primary %} 注意为了方便您的使用,请将上述三个脚本文件放置在同一个目录下,然后赋于执行权限,运行./intsll.sh即可完成安装。 {% endnote %}

ParuAxel 与 Paria 功能对比

特性ParuAxel.sh (V1.4)Paria.sh (V2.0)
下载工具curl(单线)或axel(多线程)aria2c(多线程,默认启用)
镜像检测逻辑优先遍历镜像,失败后回退 GitHub先尝试原始地址,失败后遍历镜像,不自动回退
URL 拼接处理简单拼接,可能产生双斜杠或路径错误检查结尾斜杠,确保路径拼接正确
DNS 配置无自定义 DNS 服务器(Cloudflare)
错误处理简单回退,无详细日志详细错误分级(WARN/ERROR/FATAL),明确退出码
镜像检测方法wget --spidercurl --head
代码结构字符串处理复杂,多次替换使用正则提取配置,逻辑更简洁

Git克隆修改为SSH

由于在执行依赖安装时,有时候Paru会调用git clone 命令,但是默认是从 https://github.com 克隆仓库,而当它无法访问时可以尝试配置好ssh后采用ssh方法来克隆,于是全局修改https://github.com为git@github.com:github.com.

1
2
3
4
5
6
7
[user]
	email = YourEmail
	name = YourName
[url "git@github.com:"]
	insteadOf = https://github.com/
[init]
	defaultBranch = main