科技 · 實用指南
curl 錯誤 23?先證明是檔案、管線還是封裝程式拒絕輸出
「Failure writing output to destination」是本機寫入失敗,不代表伺服器或網路失敗。保留命令與狀態,分離檔案輸出與管線,再只修真正拒絕資料的目的地。

curl 退出碼 23 表示收到的資料無法寫入本機檔案,或寫入回呼傳回錯誤。訊息只定位寫入邊界;下游可能主動停止、路徑可能不存在、檔案系統可能已滿,封裝程式也可能使用另一個暫存目錄。
不要先加 sudo、重裝 curl 或隱藏 stderr。保存完整命令與管線各段狀態,再以同一 URL 寫入可控檔案,藉此判斷要查檔案目的地或右側讀取程式。
凍結命令並分類目的地
保存完整命令,記錄 curl --version、type -a curl、輸出選項、重新導向與管線中的每個程式;腳本還要記工作目錄。
在 Bash 立刻記錄 ${PIPESTATUS[@]},避免最後一段的零狀態掩蓋 curl 23,並先定義要完整檔案、完整串流或僅早期命中。
以一次可控檔案寫入分流
以同一 URL 和必要選項改用 --output 寫入自己可控的新檔,暫時移除 head、grep 與安裝器。
可控檔成功就查原消費端或封裝;仍失敗則保留 23 前的 warning,先查路徑。
稽核真實檔案目的地
確認父目錄、該檔案系統的區塊與 inode,並以同一使用者建立小型暫存檔。
巢狀 -o 路徑只建立需要的父目錄;檢查符號連結、唯讀掛載、容器綁定與沙箱範圍,不先放寬權限。
稽核管線或提前結束的讀取端
head 與 grep -q 取得足夠輸入會提前結束,寫端因而收到斷管;curl 無法判斷是否出於設計。
若後續需要完整內容,先下載至暫存檔、驗證,再交給讀取程式,不能掩蓋 23。
檢查封裝、窄修並驗收
僅封裝版本失敗時,核對實際執行檔、限制、暫存目錄及 /usr/bin/curl,不因別人的 Snap 案例直接解除安裝。
窄修後只重跑一次,核 curl 與讀取端狀態、大小及校驗和,並刪除易被誤認成功的殘缺檔。
