Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

curl 錯誤 23?先證明是檔案、管線還是封裝程式拒絕輸出

「Failure writing output to destination」是本機寫入失敗,不代表伺服器或網路失敗。保留命令與狀態,分離檔案輸出與管線,再只修真正拒絕資料的目的地。

Original technical diagram separating curl exit 23 evidence into file, pipeline and wrapper checks.
原創插畫:先隔離寫入目的地,再改權限或重裝 curl。 Watch at Ease

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 與讀取端狀態、大小及校驗和,並刪除易被誤認成功的殘缺檔。

Original decision diagram for early-closing pipes, file destinations, wrappers and verification after curl error 23.
原創插畫:提前結束的讀取與完整下載失敗需要不同驗收。 Watch at Ease