Mac OS X环境下iTerm2中原生curl命令失效问题求助
解决Mac OS X下iTerm2中原生curl失效的问题
最近在Mac OS X 12.3上用iTerm2(3.4.15)的时候碰到个挺奇怪的问题:系统原生的curl命令不管切换到zsh还是bash shell,都没法正常建立连接,但在系统自带的Terminal应用里,同一个版本的curl却能正常跑。更有意思的是,用Homebrew安装的另一个curl版本在iTerm2里完全没问题,看来问题大概率出在iTerm2和原生curl的交互上。
当尝试用原生curl访问google.com时,得到的错误输出是这样的:
* Trying 108.177.15.138:80... * connect to 108.177.15.138 port 80 failed: Bad file descriptor * Trying 108.177.15.100:80... * connect to 108.177.15.100 port 80 failed: Bad file descriptor * Trying 108.177.15.113:80... * connect to 108.177.15.113 port 80 failed: Bad file descriptor * Trying 108.177.15.139:80... * connect to 108.177.15.139 port 80 failed: Bad file descriptor * Trying 108.177.15.102:80... * connect to 108.177.15.102 port 80 failed: Bad file descriptor * Trying 108.177.15.101:80... * connect to 108.177.15.101 port 80 failed: Bad file descriptor * Failed to connect to google.com port 80 after 48 ms: Bad file descriptor * Closing connection 0 curl: (7) Failed to connect to google.com port 80 after 48 ms: Bad file descriptor
排查方向与解决方案
结合现象来看,优先从权限和配置差异这两个方向入手,你可以按顺序试试下面的方法:
1. 检查iTerm2的系统权限
Mac的隐私权限管控很严格,有可能是iTerm2缺少了必要的网络或磁盘访问权限:
- 打开「系统设置」→「隐私与安全性」→「完全磁盘访问权限」,确认iTerm2已经在列表里且被勾选。
- 如果有「网络访问」相关的权限选项,也确保iTerm2没有被限制。
- 改完权限后记得重启iTerm2,再测试原生curl。
2. 对比Terminal和iTerm2的环境变量
环境变量的差异经常会导致这类“同命令不同终端表现不同”的问题:
- 分别在Terminal和iTerm2里执行
env命令,把输出保存下来对比,重点看和网络、路径相关的变量,比如HTTP_PROXY、HTTPS_PROXY、PATH这些。 - 如果发现iTerm2里有异常的代理变量,先临时取消(比如执行
unset HTTP_PROXY)再测试curl。 - 另外也可以确认下原生curl的路径:在两个终端里都执行
which curl,看是否都是/usr/bin/curl,避免路径被干扰。
3. 重置iTerm2的配置
有时候自定义的iTerm2配置会引发奇怪的兼容性问题,重置配置试试:
- 先关闭iTerm2,然后在终端执行
rm -rf ~/Library/Application\ Support/iTerm2/删除配置文件。 - 重新打开iTerm2,测试原生curl是否恢复正常。
4. 排查第三方安全软件
如果你装了第三方防火墙、杀毒软件或者网络代理工具,它们可能会拦截iTerm2里的原生curl请求。暂时关闭这类软件,再测试看看是否解决问题。
相关版本信息
系统原生curl版本
curl 7.79.1 (x86_64-apple-darwin21.0) libcurl/7.79.1 (SecureTransport) LibreSSL/3.3.5 zlib/1.2.11 nghttp2/1.45.1 发布日期:2021-09-22 支持协议:dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 特性:alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets
Homebrew安装的curl版本
curl 7.82.0 (x86_64-apple-darwin21.3.0) libcurl/7.82.0 (SecureTransport) OpenSSL/1.1.1n zlib/1.2.11 brotli/1.0.9 zstd/1.5.2 libidn2/2.3.2 libssh2/1.10.0 nghttp2/1.47.0 librtmp/2.3 OpenLDAP/2.6.1 发布日期:2022-03-05 支持协议:dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp 特性:alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL TLS-SRP UnixSockets zstd
系统环境
- Mac OS X 12.3
- iTerm2 3.4.15
内容的提问来源于stack exchange,提问作者Niels




