首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RCurl的sftp协议--最后一步,如何将R路径从usr/lib更改为usr/lib到usr/local/lib

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

Stack Overflow用户
提问于 2017-09-29 05:45:11
回答 3查看 3.2K关注 0票数 3

首先--我知道这不是一个具体的代码问题,所以可以投票结束这个问题,但是我今天花了大半个时间来解决这个问题,可能需要一些帮助。我还认为这个线程可以帮助任何试图让sftp协议在R中工作的人,因为我将分享我今天所做的事情。

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

代码语言:javascript
复制
> 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,并在一定程度上成功地做到了这一点。成功部分反映在我在命令行中运行以下部分时:

代码语言:javascript
复制
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 

太棒了,因为我的卷发更新了。但是,当我在R中加载RCurl并运行curlVersion()时,它不会被更新。我检查了我的/usr/目录的lib文件夹,并遇到了以下问题。在我的/usr/lib和/usr/local/lib中都存在libcurl文件。具体地说:

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

我的/usr/local/lib目录中的文件是我想要使用的新文件,但是这里是我最头疼的地方。我将/usr/local/lib中的四个文件复制到/usr/lib中,并破坏了我的计算机。我的许多应用程序停止加载,我不得不重新安装我的OS,因为我害怕破坏任何其他东西。当我重新安装我的OS时,它会将我的文件放回它们各自的文件夹中(它们在上面的子弹中的样子)。

如果我不得不猜的话,我可能不该移动.a或.la文件.我没有把握。

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

代码语言:javascript
复制
$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()给出了如下内容:

代码语言:javascript
复制
.libPaths()
"/Library/Frameworks/R.framework/Versions/3.4/Resources/library"

...if --它对我们有帮助

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

代码语言:javascript
复制
> 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

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-29 16:57:12

从源头上安装RCurl对我来说是个窍门!

代码语言:javascript
复制
install.packages("RCurl", type="source")

我在这里找到了解决方案-- http://www.omegahat.net/RCurl/FAQ.html --特别是以下几行。

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

RCurl确实支持它,但可能的问题是您安装的libcurl版本不支持它。您可以通过命令RCurl检查您的libcurl以及因此支持的curlVersion协议。如果scp和sftp不存在,请重新安装libcurl,但使用libssh2提供支持。在安装libcurl之前,您需要安装libssh2开发库和头。在某些OSes上,您需要从源重新构建RCurl。“

总的来说,这是对我的问题从头到尾的一个伟大的总结。如果您的RCurl版本不支持sftp,您需要首先安装(在命令行) libssh2,然后重新安装libcurl,然后出于某种原因从源代码重新构建。

票数 1
EN

Stack Overflow用户

发布于 2019-01-07 00:04:48

呼!最后,在一个带有rstudio的Ubuntu14.04对接容器中实现了这个功能。我把每一个问题都搞定了!但我不得不花更多的时间来计算找到所有这些东西,所以试图把所有这些都放在一个地方,让任何有这个问题的人--这就是我所做的.

在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

如果您需要卷曲在终端使用sftp,它可能仍然没有在这一点。验证它是否使用了您刚刚安装的新libcurl.so.4。您刚刚安装的curl将安装到/usr/local/bin中,因此使用ldd验证它没有使用旧库。我使用的是一个旧的libcurl,所以我将旧libcurl链接到/usr/local/lib中的新libcurl,然后重新编译curl。

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

在R控制台中:

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

验证sftp协议已启用

libcurlVersion() RCurl::curlVersion()

这些应该分别显示为libcurl和RCurl启用的协议。把你们的手指交出来!

以防万一,我也做了这些事情,可能没做什么,但我做的时候,我是在撞墙,只是保持在原地。

升级的R和R工作室-服务器

在重新安装RCurl之前删除curl和RCurl的R版本。另外,在较新的rstudio中,不确定是否需要type=“源代码”。

同样,正如Canovice所指出的,在libcurl和libssh库中移动要小心。我打破了几次网络,幸运的是,因为它是一个码头容器,我刚刚重新启动。我发现一次移动一切都是最有效的,

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

还应该注意,我是一个R新手,所以可能有更干净的方法来实现这一点,而不是到处移动库。我尝试在rstudio中使用.libaths(),但最终放弃了。

票数 5
EN

Stack Overflow用户

发布于 2020-03-03 20:37:27

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

在我的例子中,我的新curlopenssl支持sftp,安装在

代码语言:javascript
复制
/usr/local/opt/curl-openssl/bin
/usr/local/opt/openssl/lib/

因此,我需要设置以下环境

代码语言:javascript
复制
PATH="/usr/local/opt/curl-openssl/bin:${PATH}"
LIBRARY_PATH="/usr/local/opt/openssl/lib/:${LIBRARY_PATH}"

在执行之前

代码语言:javascript
复制
install.packages("RCurl", type="source")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46482465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档