You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_PROXYHTTPS_PROXYPATH这些。
  • 如果发现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

火山引擎 最新活动