curl 退出程式碼大全(1-99):按編號查詢含義與修復方法

按編號快速查詢任意 curl exit code(退出程式碼,1-99)——清晰說明含義、常見原因和具體修復方法。適用於 CI/CD 流水線、cron 任務和 Shell 指令碼除錯的開發者參考手冊。

curl exit code 對照表
程式碼 常量名 含義 常見原因
連線・初始化錯誤
1 CURLE_UNSUPPORTED_PROTOCOL 表示 curl 不支援 URL 中指定的協議。 使用了編譯時停用該協議(如 gopher、ldap)的 curl 二進位制檔案,或 URL 協議部分拼寫錯誤。
2 CURLE_FAILED_INIT 表示 curl 的內部初始化失敗。 記憶體不足或環境異常等極少發生的底層初始化失敗。
3 CURLE_URL_MALFORMAT 表示指定的 URL 格式不正確,curl 無法解析。 URL 缺少協議字首(如遺漏 http://)或包含非法字元時發生。
5 CURLE_COULDNT_RESOLVE_PROXY 表示 curl 未能解析指定代理伺服器的主機名。 --proxy 指定的主機名拼寫錯誤,或代理專用 DNS 無法完成名稱解析。
6 CURLE_COULDNT_RESOLVE_HOST 表示 curl 未能解析(DNS)目標主機的主機名。 典型原因是域名拼寫錯誤、DNS 伺服器故障,或在離線環境中執行命令。
7 CURLE_COULDNT_CONNECT 表示已完成名稱解析,但 curl 未能與伺服器建立 TCP 連線。 埠號錯誤、被防火牆攔截,或伺服器處於宕機狀態時發生。
8 CURLE_WEIRD_SERVER_REPLY 表示 curl 收到了伺服器返回的無法解釋的異常格式響應。 FTP 伺服器返回非標準響應,或誤連到使用不同協議的伺服器時容易發生。
9 CURLE_REMOTE_ACCESS_DENIED 表示已連線到伺服器,但訪問被拒絕。 FTP 目錄許可權不足,或觸發了伺服器端的 IP 限制時發生。
資料傳輸錯誤
18 CURLE_PARTIAL_FILE 表示傳輸在完成前被中斷,檔案只接收了一部分。 網路瞬斷,或伺服器在到達預告的 Content-Length 之前提前斷開連線時發生。
23 CURLE_WRITE_ERROR 表示向本地磁碟或回撥目標寫入資料失敗。 磁碟空間不足,或對輸出檔案沒有寫入許可權時發生。
26 CURLE_READ_ERROR 表示讀取待上傳的本地檔案失敗。 -T/--upload-file 指定的檔案不存在,或沒有讀取許可權時發生。
52 CURLE_GOT_NOTHING 表示已連線到伺服器,但完全沒有收到任何響應。 典型原因是伺服器程序在請求過程中崩潰,或配置不當導致返回空響應。
55 CURLE_SEND_ERROR 表示向網路傳送資料失敗。 連線建立後對方立即斷開,或本地網路接口出現異常時發生。
56 CURLE_RECV_ERROR 表示從網路接收資料失敗。 通訊過程中對方意外重置連線(Connection reset by peer)時較為常見。
63 CURLE_FILESIZE_EXCEEDED 表示檔案大小超過了 --max-filesize 指定的上限。 獲取的響應比預期更大,觸發了為安全起見設定的上限時發生。
78 CURLE_REMOTE_FILE_NOT_FOUND 表示遠端伺服器上不存在指定的檔案(如 FTP)。 FTP 路徑拼寫錯誤,或目標檔案已被刪除或移動時發生。
SSL/TLS 證書錯誤
35 CURLE_SSL_CONNECT_ERROR 表示在 SSL/TLS 握手過程中出現問題,未能建立連線。 伺服器與客戶端支援的 TLS 版本・加密套件不一致時容易發生。
51 CURLE_PEER_FAILED_VERIFICATION 表示伺服器證書驗證失敗(例如證書內容與主機名不匹配等)。 訪問自簽名證書,或證書的 Common Name / SAN 與目標主機名不一致時發生。
58 CURLE_SSL_CERTPROBLEM 表示本地指定的客戶端證書存在問題。 --cert 指定的證書檔案格式不正確,或密碼短語輸入錯誤是典型原因。
60 CURLE_SSL_CACERT 表示無法確認用於驗證伺服器證書的 CA 證書鏈。 CA 證書包過舊,或企業代理等使用的自簽名 CA 未註冊到信任庫時發生。雖然可用 -k/--insecure 規避,但不建議在生產環境中使用。
HTTP・認證錯誤
22 CURLE_HTTP_RETURNED_ERROR 表示在指定 -f/--fail 選項時,HTTP 響應返回了 400 以上的錯誤狀態碼。 在 CI/CD 指令碼中使用 curl -f,以便在 API 返回錯誤狀態時將其檢測為失敗。
67 CURLE_LOGIN_DENIED 表示伺服器拒絕了登入(認證)請求。 使用者名稱或密碼錯誤,或 FTP/SMTP 等賬戶被鎖定是典型原因。
其他
27 CURLE_OUT_OF_MEMORY 表示 curl 在執行過程中記憶體分配失敗。 在記憶體不足的環境中處理超大檔案等罕見情況下發生。
28 CURLE_OPERATION_TIMEDOUT 表示操作未能在 --connect-timeout/--max-time 等指定的時間限制內完成。 伺服器響應緩慢、網路延遲,或超時值設定過短時發生,是 CI 中最常見的錯誤之一。
47 CURLE_TOO_MANY_REDIRECTS 表示重定向次數超過了 --max-redirs 指定的上限。 重定向迴圈(301/302 迴圈跳轉),或超過預設上限(50 次)的正規重定向鏈時發生。

使用提示

  • 可以在命令執行後立即用 $?(Bash)或 %errorlevel%(Windows)檢視 exit code。在 Shell 指令碼中使用 curl ... || echo "failed with $?" 這樣的寫法便於分支處理。
  • 28(超時)與 7(連線失敗)容易混淆,區別在於:28 是連線建立後響應緩慢,7 是根本無法建立 TCP 連線本身。
  • 出現 60(CA 證書錯誤)時不要輕易用 -k/--insecure 規避,應先確認 CA 證書包(ca-certificates)是否為最新版本。在生產環境中長期使用 -k 會增加中間人攻擊的風險。
  • 22(HTTP 錯誤)只會在添加了 -f/--fail 選項時出現。若不新增,即使收到 404 或 500,curl 也會返回 exit code 0(成功),因此在 CI 中若想檢測失敗,務必新增 -f。

常見問題

執行 curl 命令後,可在 Bash/Zsh 中用 echo $?、在 Windows 命令提示符中用 echo %errorlevel%、在 PowerShell 中用 $LASTEXITCODE 檢視。

首先重新檢查 --connect-timeout--max-time 的設定值,必要時適當延長。如果伺服器響應長期緩慢,也應確認伺服器負載狀況和網路路徑(代理、VPN 等)。

兩者不同。HTTP 狀態碼(如 404、500)是伺服器返回的協議層響應,而 curl exit code 表示 curl 命令本身的執行結果(連線失敗、超時等)。curl 預設將 HTTP 錯誤也視為 exit code 0(成功),因此需注意不要混淆兩者。

新增 curl -f(--fail)選項後,當 HTTP 響應為 400 以上時會返回 exit code 22。如果不新增該選項,即便只是成功獲取了一個錯誤頁面,exit code 也會是 0。

6(COULDNT_RESOLVE_HOST)是在 DNS 階段無法將主機名解析為 IP 地址的錯誤,7(COULDNT_CONNECT)則是名稱解析成功後,未能與該 IP 地址建立 TCP 連線的錯誤。
ツールくん

閒話 ― curl exit code 體系

curl 是由 Daniel Stenberg 於 1996 年開始開發的命令列工具,最初名字樸素得很,就叫「httpget」。誰也沒想到,這個當初為了抓取網頁而寫的小工具,如今幾乎已經成了所有 Linux 發行版、macOS 以及 Windows 10 及以上版本的標配,也順理成章地成為了 Web 開發者最基礎、最離不開的工具之一。

正因為 curl 承擔著如此繁重的網路通訊任務,它的 exit code 體系也設計得相當細緻——每一個編號都與 libcurl 內部的錯誤列舉型別 CURLcode 一一對應,從 CURLE_OK(成功,exit code 0)開始按順序編號定義。仔細查閱就會發現這套編號裡存在一些缺口,這是因為在漫長的開發歷程中,有部分錯誤程式碼被廢棄或者合併進了其他程式碼,留下的空位就這樣一直保留至今。

有趣的是,curl 的 exit code 並沒有沿用 POSIX 的一般慣例(0 表示成功,1 表示籠統的一般錯誤),而是發展出了一套完全屬於自己的獨立體系。這也意味著,在 Shell 指令碼中需要橫向處理多個命令的 exit code 時,不能想當然地套用同一套規則,而必須分別查閱各工具自己的手冊來確認具體含義——這正是本頁面這類速查表存在的意義所在。