DD脚本 在日志输出curl被调用的序号 输出curl命令和参数 执行预设的命令

前言

在 DD脚本群

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

思路

上一篇我们发现不能简单的将某个资源提前放到VPS指定的位置
因为会出现 不同的资源 放到VPS上同一个位置的情况.

那么我们换个思路.
在整个脚本的执行过程中, 所有的curl命令的内容和次序是固定的.
换句话说, 我们每次执行脚本时, 第1句, 第2句, 第3句, ... 第n句curl命令的内容是固定的.
哪怕脚本中某一条curl语句被放在了循环中, 被执行了多次. 但是从展开后的执行序列来说, 每次curl命令的内容是固定的.

实践

所以我们
在已有的脚本头部添加一个这样的curl壳子:
1) 记录并打印一个调用序号. 每次调用序号增1
2) 输出 pwd 当前目录
3) 输出完整的 curl 命令及全部参数
4) 这个curl壳, 并不去真正下载文件.
5) 根据调用序号, 执行预设的命令. 如, 
cp file1 /path/to/file
cat file2
来替代 curl -LO 或 curl  -Lo 的保存文件的命令
或 curl -L 的输出到stdout的命令
6) 这些预设命令是会被人工编辑而增加的. 用case实现 5) 的逻辑.
7) 这个curl壳, 永远返回成功. 

把这个要求发给GPT, 得到
# 全局调用计数器
curl_call_count=0

curl() {
    curl_call_count=$((curl_call_count + 1))

    # 输出调用序号和当前目录(到 stderr)
    echo "[DEBUG] curl call # $curl_call_count" >&2
    echo "[DEBUG] Current directory: $(pwd)" >&2

    # 输出完整命令(包含所有参数,安全转义)
    printf '[DEBUG] Command: curl ' >&2
    printf '%q ' "$@" >&2
    printf '\n' >&2

    echo >&2

    # 根据调用序号执行预设命令
    case "$curl_call_count" in
         1)
             # 第 1 次调用时执行的命令
             # cp 1 /path/to/file"
             ;;
         2)
             # 第 2 次调用时执行的命令
             # cat 2
             ;;
        *)
            # 未设置预设命令
            echo "[DEBUG] 未设置预设命令" >&2
            # 可以调用真实的curl
            # command curl "$@"
            ;;
    esac

    # 不执行真实下载,只打印信息
    # 永远返回成功
    return 0
}
修改原本的 resinstall.sh 脚本 改成这样

将修改后的 reinstall-edited-2.sh 上传到VPS, 测试
bash reinstall-edited-2.sh debian 13
debian 13 为示例.
得到这样的报错日志.

我们假设这个VPS因为有些原因访问不了 www.qualcomm.cn 
要改为访问 www.cloudflare.com
那么我们把 case 1 改成这样
command curl -L http://www.cloudflare.com/cdn-cgi/trace

再尝试 bash reinstall-edited-2.sh debian 13
日志很奇怪的打印了2个 序号1

去问GPT, 原因猜测是 管道命令 如 curl xxx | something
GPT建议我们改成临时文件.
# 全局调用计数器
COUNT_FILE="/root/curl_call_count.tmp"
echo "0" > "$COUNT_FILE"

curl() {
    curl_call_count=$(cat "$COUNT_FILE")
    curl_call_count=$((curl_call_count + 1))
    echo "$curl_call_count" > "$COUNT_FILE"
这下序号就对了.

我们一个一个解决.

序号2 为
[DEBUG] curl call # 2
[DEBUG] Current directory: /root
[DEBUG] Command: curl -Lo /reinstall-vmlinuz https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
我们把 https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux 用我们的方法下载, 再上传到 VPS 的 /root/ 文件名 2
然后在脚本的 case 2) 写成这样
cp /root/2 /reinstall-vmlinuz

同样的道理, 处理序号 3. 下载文件, 上传到 /root/  文件名 3
cp /root/3 /reinstall-initrd
对于序号 4 5 6 7 8 9, 是请求 github 资源. 假设我们的VPS访问不了 github, 需要借助 github proxy, 比如: https://gh-proxy.com/
那么把 case 写成这样
4|5|6|7|8|9)
    local args=()
    for arg in "$@"; do
        if [[ "$arg" =~ ^https?:// ]]; then
            args+=("https://gh-proxy.com/$arg")
        else
            args+=("$arg")
        fi
    done
    
    command curl "${args[@]}"
    ;;
对于序号 10, 原始命令是 curl -L 所以我们把 http://deb.debian.org/debian/dists/trixie/main/debian-installer/binary-amd64/Packages.gz 用我们的方式下载后, 上传到 VPS 的 /root/ 文件名 10
然后 case 里用 cat
10)
    cat /root/10
    ;;
再尝试 bash reinstall-edited-2.sh debian 13
出现了新的序号 11
跟处理序号 2 是一样的. 略.

再尝试 bash reinstall-edited-2.sh debian 13
出现了新的序号 12
跟处理序号 2 是一样的. 略.

再尝试 bash reinstall-edited-2.sh debian 13
出现了新的序号 13
跟处理序号 10 是一样的. 略.

再尝试 bash reinstall-edited-2.sh debian 13
出现了新的序号 14
跟处理序号 2 是一样的. 略.

再尝试 bash reinstall-edited-2.sh debian 13

搞定!


重启VPS
等了一段时间, 重新登录. 
没问题, DD 成功!

评论

The Hot3 in Last 7 Days

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

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