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 ' >&2printf '%q ' "$@" >&2printf '\n' >&2echo >&2# 不执行真实下载,只打印信息# 永远返回成功return 0}
我们把修改过的 reinstall-edited.sh 上传到 VPS, 测试
bash reinstall-edited.sh debian 13
* debian 13 为示例.
日志打印为:
[DEBUG] Current directory: /rootcurl -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: /rootcurl -Lo /reinstall-vmlinuz https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux[DEBUG] Current directory: /rootcurl -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的指定位置. 注意, 可能需要修改文件名.
所以我们用自己的方法下载文件, 再上传到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行代码 肯定是不行的.
未完待续.


















评论
发表评论