使用RCurl的sftp协议 - 最后一步,如何将来自usr / lib的libcurl的R路径更改为usr / local / lib

时间:2017-09-29 05:45:12

标签: r curl libcurl rcurl

首先 - 我知道这不是特定的代码问题,所以请随意投票结束这个问题,但是我今天半天的大部分时间都在努力解决这个问题。使用一些帮助。我也认为这个主题可以帮助任何人试图让sftp协议在R中工作,因为我将分享我今天所做的事情。

我一直在尝试更新RCurl,因此它支持sftp协议。在R中,我的协议看起来如此(包括版本和主机):

> library(RCurl)
> curlVersion()$protocols
 [1] "dict"   "file"   "ftp"    "ftps"   "gopher" "http"   "https"  "imap"   "imaps"  "ldap"   "ldaps"  "pop3"   "pop3s"  "rtsp"   "smb"    "smbs"  
[17] "smtp"   "smtps"  "telnet" "tftp" 

> curlVersion()$version
[1] "7.43.0"

> curlVersion()$host
[1] "x86_64-apple-darwin15.0"

不太好 - 没有sftp选项...

我按照这个帖子 - http://andrewberls.com/blog/post/adding-sftp-support-to-curl - 来更新我的机器上的curl,并且部分成功了。成功部分反映在我在命令行中运行以下内容时:

curl -V 
curl 7.55.1 (x86_64-apple-darwin15.6.0) libcurl/7.55.1 zlib/1.2.5 
libssh2/1.8.0
Release-Date: 2017-08-14
Protocols: dict file ftp gopher http imap ldap ldaps pop3 rtsp scp sftp smtp telnet tftp 
Features: AsynchDNS IPv6 Largefile libz UnixSockets 

这很棒,因为我已经更新了curl。但是,当我加载RCurl并在R中运行curlVersion()时,它没有更新。我检查了/ usr /目录的lib文件夹,并出现以下问题。在我的/ usr / lib和/ usr / local / lib中,都存在libcurl文件。具体做法是:

  • libcurl.3.dylib,libcurl.4.dylib和/ usr / lib中的libcurl.dylib
  • / usr / local / lib中的libcurl.4.dylib,libcurl.dylib,libcurl.a和libcurl.la

我的/ usr / local / lib目录中的文件是我喜欢使用的新文件,但这是我头疼的开始。我将/ usr / local / lib中的四个文件复制到/ usr / lib和我的计算机中。我的许多应用程序都停止加载,我不得不重新安装我的OS X,因为它害怕搞乱其他任何东西。当我重新安装我的OS X时,它将我的文件放回各自的文件夹中(它们如何查看上面的项目符号)。

如果我不得不猜测,我可能不应该移动.a或.la文件...我不确定。

最后一件事 - 当我在控制台中运行$ $ PATH时,我得到:

$PATH
-bash: /Users/Home/.rvm/gems/ruby-2.3.3/bin:/Users/Home/.rvm/gems/ruby-2.3.3@global/bin:/Users/Home/.rvm/rubies/ruby-2.3.3/bin:/Users/Home/anaconda2/bin:/usr/local/git/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/TeX/texbin:/Users/Home/.rvm/bin: No such file or directory

/ usr / local / bin在/ usr / bin之前。但我没有看到/ usr / local / lib或/ usr / lib的任何内容 - 我可以将这些(/ usr / local / lib)添加到我的路径来解决这个问题吗? R中的.libPaths()给了我这个:

.libPaths()
"/Library/Frameworks/R.framework/Versions/3.4/Resources/library"

......如果它有帮助的话

编辑 - 我应该注意到,所有问题的根源在于,因为' sftp'没有在R中的curlVersion()$ protocols中列出,当我运行RCurl :: getURL()或RCurl :: ftpUpload()(我希望使用ftpUpload)时,我收到错误:

> RCurl::ftpUpload(what = 'myfile.txt', to = 'sftp://userid:userpw@ip/'myfile.txt')
Error in function (type, msg, asError = TRUE)  : 
  Protocol "sftp" not supported or disabled in libcurl

谢谢!

3 个答案:

答案 0 :(得分:1)

Ph!终于在带有rstudio-server的Ubuntu 14.04 docker容器中使它工作了。我碰到每一个问题!但是我不得不花更多的时间去寻找所有这些东西,所以试图将所有这些东西都放在一个地方,这是我所做的……

在linux终端中:

apt-get install libcurl4-openssl-dev

wget libssh2 and then compile with ordinary

./configure

make

make install

wget curl and then compile

./configure --with-sshlib2=/usr/local

make

make install

如果需要curl才能在sftp终端中工作,则此时可能仍然不需要。使用刚刚安装的新libcurl.so.4验证其。您刚安装的curl将安装在/ usr / local / bin中,因此请使用ldd验证其是否未使用旧库。我的使用的是旧的libcurl,所以我在/ usr / local / lib中将旧的libcurl链接到新的libcurl,然后重新编译curl。

如果希望RCurl正常工作,请将所有新库从/ usr / local / lib(libcurl&libssh2)复制到/ lib,然后移至R控制台。

在Rconsole中:

install.packages("RCurl", type = "source")

验证sftp协议已启用

libcurlVersion()  RCurl::curlVersion()

这些应该显示您分别为libcurl和RCurl启用的协议。用手指指着sftp!

以防万一,我也做了这些可能做不了多少的事情,但是当我撞墙并保持在原位的时候我做了。

升级了R和R工作室服务器

在重新安装RCurl之前,删除了curl和RCurl的R版本。同样,在较新的rstudio中,不确定是否需要type =“ source”。

也正如Canovice所指出的,在libcurl和libssh库中移动时要小心。幸运的是,我断开了网络两次,因为这是我刚刚重启的Docker容器。我发现一次移动所有内容效果最佳,

cp /usr/local/lib/libssh* /lib && cp /usr/local/lib/libcurl* /lib

还应注意,我是R的新手,因此比遍地移动库可能是更干净的方法。我尝试在rstudio中使用.libaths(),但最终放弃了。

答案 1 :(得分:1)

在实践中,我发现尝试更新现有的curlopenssl安装比安装全新版本并更新将在其中使用的PATH envar更危险

就我而言,安装了sftp的较新版本curlopenssl

/usr/local/opt/curl-openssl/bin
/usr/local/opt/openssl/lib/

因此,我需要设置以下envar

PATH="/usr/local/opt/curl-openssl/bin:${PATH}"
LIBRARY_PATH="/usr/local/opt/openssl/lib/:${LIBRARY_PATH}"

执行前

install.packages("RCurl", type="source")

答案 2 :(得分:0)

从源代码安装RCurl为我做了诀窍!

install.packages("RCurl", type="source")

我在这里找到了解决方案 - http://www.omegahat.net/RCurl/FAQ.html - 具体来说,以下几行。

“我不能在RCurl中使用scp或sftp,但curl的文档似乎表明它可以。那么为什么RCurl不支持它?

RCurl支持它,但可能的问题是你安装的libcurl版本不支持它。您可以通过命令curlVersion检查libcurl和RCurl支持的协议。如果不存在scp和sftp,请重新安装libcurl,但使用libssh2支持。在安装libcurl之前,您需要安装libssh2开发库和头文件。在某些操作系统上,您需要从源代码重建RCurl。“

总的来说,这是我从头到尾的一个很好的总结。如果你的RCurl版本不支持sftp,你需要首先安装(在命令行)libssh2,然后重新安装libcurl,然后由于某种原因从源重建。