带有 RCurl 的 sftp 协议 - 最后一步,如何将 libcurl 的 R 路径从 usr/lib 更改为 usr/local/lib

Can*_*ice 3 curl r 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"
Run Code Online (Sandbox Code Playgroud)

不是很好 - 没有 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 
Run Code Online (Sandbox Code Playgroud)

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

  • /usr/lib 中的 libcurl.3.dylib、libcurl.4.dylib 和 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
Run Code Online (Sandbox Code Playgroud)

/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"
Run Code Online (Sandbox Code Playgroud)

...如果它有帮助的话

编辑 - 我应该注意到所有问题的根源,当然,是因为 '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
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 5

呼!最终在带有 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,所以我将旧的 libcurl 链接到 /usr/local/lib 中的新 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 新手,所以可能有比在整个地方移动库更干净的方法来做到这一点。我尝试.libaths(在 rstudio 中使用),但最终放弃了。