DD脚本 输出所需资源的链接

前言

在 DD脚本群

有群友遇到网络不好, 脚本下载资源时容易中断的问题.


思路

我有一个想法, 
1) 让这个脚本把所有需要下载的资源的链接输出
2) 使用者自己去下载资源, 并上传到VPS上

实践

分析一下这个DD脚本
https://github.com/bin456789/reinstall/raw/refs/heads/main/reinstall.sh

在脚本的开头, 看到作者已经实现了一个 curl 函数, 用于包装系统的curl.

这是一个很好的思路.
我们可以在此基础上, 作如下修改:
1. 输出 pwd 当前目录
2. 输出完整的 curl 命令及全部参数
3. 这个curl壳, 并不去真正下载文件.
4. 这个curl壳, 永远返回成功.

拿着这些去问GPT.
最终修改成这样:


curl() {
    # 输出当前工作目录
    echo "[DEBUG] Current directory: $(pwd)" >&2

    # 输出完整命令(含全部参数)
    printf 'curl ' >&2
    printf '%q ' "$@" >&2
    printf '\n' >&2

    echo >&2

    # 不执行真实下载,只打印信息
    # 永远返回成功
    return 0
}

我们把修改过的 reinstall-edited.sh 上传到 VPS, 测试
bash reinstall-edited.sh debian 13
debian 13 为示例.

日志打印为:
[DEBUG] Current directory: /root
curl -L http://www.qualcomm.cn/cdn-cgi/trace

我们在脚本中搜索 http://www.qualcomm.cn/cdn-cgi/trace 找到如下代码

我们需要让此处的curl调用系统真正的curl, 而不是我们的curl壳.
在与GPT的交流后, 我们知道, 加上 command 就可以调用系统的curl了, 就像这样:

再次执行
bash reinstall-edited.sh debian 13
日志打印为:
[DEBUG] Current directory: /root
curl -Lo /reinstall-vmlinuz https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux

[DEBUG] Current directory: /root
curl -Lo /reinstall-initrd https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz


我们拿着这个报错去问GPT
程序输出这样的日志, 然后失败. 
我为了补救, 应该下载什么url的资源, 放到vps的什么位置, 文件名是什么?
得到这样的结果.
根据程序输出的日志,我来分析补救方案:
第一个文件:
下载 URL: https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
存放位置: /reinstall-vmlinuz
文件名: reinstall-vmlinuz

第二个文件:
下载 URL: https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
存放位置: /reinstall-initrd
文件名: reinstall-initrd

我们现在是假设VPS的网络不稳定, 所以不能让脚本下载文件.
所以我们用自己的方法下载文件, 再上传到VPS的指定位置. 注意, 可能需要修改文件名.

然后再继续尝试 bash reinstall-edited.sh debian 13
有了新的报错

我们重施故技, 在脚本中搜索 脚本有更新,请重新下载 找到

这2个curl都是下载工具脚本, 都是小体积文件, 相信VPS能下载成功. 所以我们都在curl前面加上 command
(略, 不附图了)

继续尝试  bash reinstall-edited.sh debian 13
报错如下

上面4个
fix-eth-name.sh
fix-eth-name.service
get-xda.sh
ttys.sh
都是小体积文件. 我们去脚本中搜索, curl 前面加上 command

后面的 .gz 用我们自己的方式下载, 再上传到VPS.
但是这个 curl -L 很可疑, 这不是保存为文件的参数.

继续尝试  bash reinstall-edited.sh debian 13
果然 Packages.gz 还是报错.

我们在脚本中搜索 Packages.gz 找到

因为我们已经把 Packages.gz 上传到VPS上了, 所以我们把原来的curl改为cat


继续尝试  bash reinstall-edited.sh debian 13
报错说找不到 Packages.gz 


查了一下这个文件确实不在了, 所以 /reinstall-tmp/initrd 是个临时目录, 每次都会被清除.
那么我们把文件放到 /root/ 并修改脚本 为 cat /root/Packages.gz

继续尝试  bash reinstall-edited.sh debian 13
这次是要保存文件到 /reinstall-tmp/initrd/

根据刚刚的经验, 这个目录是不能保存文件的, 会被清理掉.
那么我们还是把文件用自己的方式下载, 再上传到 VPS 的 /root/
然后修改脚本为 cp /root/某个文件 到 /reinstall-tmp/tmp.deb

在脚本中搜索 tmp.deb 找到

我们首先要把 openssh-server-udeb_10.0p1-7_amd64.udeb 文件下载后, 上传到 /root/
再将脚本修改为

继续尝试  bash reinstall-edited.sh debian 13
报了奇怪的错.

想了半天, 想不到原因. 
只能从正常的 resinstall.sh 入手.

把原本的 reinstall.sh 的 curl() 函数 增加 打印 curl 命令及函数 到日志文件, 但是不影响实际上的函数行为.
看看正常的流程中, 会进行哪些curl调用.

我们还是以 DD debian 13 为例.
结果是这样的:

发现 Packages.gz 不止1个. 
.udeb 文件也不止1个.

也就是说, 代码中涉及  Packages.gz 只有1句代码, 但是因为 逻辑循环等原因, 代码会被执行多次.
那么我们上面尝试的方法 直接修改那1行代码 肯定是不行的.

未完待续.

评论

The Hot3 in Last 7 Days

酒馆SillyTavern 玩英文角色卡 也能以中文输出 设置世界书Lorebooks

极简一键脚本 搭NaiveProxy梯子 自定义端口 与Caddy V2前置的VLESS/Vmess V2Ray共存 可开CDN