使用curl出现gnutls_handshake() failed: Error in the pull function或者GnuTLS recv error: Error in the pull
问题
系统:Ubuntu 16.04 LTS (amd64)
上来安了:
sudo apt-get install git
sudo apt-get install curl
然后想下载repo工具:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
在执行curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
出现错误:
错误提示一:gnutls_handshake() failed: Error in the pull function.
错误提示二:GnuTLS recv error (-54): Error in the pull function.
错误提示三:Failed to connect to storage.googleapis.com port 443: Connection refused.
(有那么一次下载成功了,其余次数都下载不了)
解决
执行sudo apt-get install libcurl4-openssl-dev
执行此句时会把libcurl4-gnutls-dev
这个包给删除先,然后再安装。这两个包是互相冲突的,安谁会把另一个先卸掉。
大概理解是,curl的依赖包中有libcurl4-gnutls-dev
,这个是默认的,但我们需要libcurl4-openssl-dev
,因为这个更好用,对https支持地更好。
等一下,我好像错怪这条curl了(上一段话请无视,curl默认使用的是gnutls,而且最开始这两个包都是没有安装的,不过这二者确实是冲突的。就算安了libcurl4-openssl-dev
,人家curl也不会变的啦,应该得需要重新编译curl才行。另外之所以curl默认使用的是gnutls,是因为其开源协议的不同,这个是BSD开源协议)。
这他喵的跟天朝的GFW有关,一般你会把/etc/resolv.conf里面添加上谷歌的dns(或者阿里的),8.8.8.8,然后你再执行这条命令就好了,但是你接着再执行就连接不上了。你用火狐浏览器都能自己把那个repo文件下载下来,再复制到~/bin里面去,但你用curl就是不好使,真是心累。
Git Repo 镜像使用,还是用清华大学镜像站吧,下载repo这个py脚本用下面命令:
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
里面的更新一节,你也做了吧,不然repo init时就会报错Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
。原因是:
repo的运行过程中会尝试访问官方的git源更新自己(但是因为你被墙了,所以又无法更新自己,自然报连接拒绝了),如果想使用tuna的镜像源进行更新,可以将如下内容复制到你的~/.bashrc
里
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
后记
搜索gnutls_handshake这个错误时,会搜到别的两篇文章。
使用 Git 同步时出现gnutls_handshake() failed: Error in the pull function
用openssl替换git中的GnuTls
后面这篇讲地更详细点,但这两篇不是解决本文问题的方法,因为我这里是使用curl发生的错误啊,关git什么事啊。