SFTP协议与RCurl - 最后一步,如何将R路径从usr/lib更改为usr/local/lib

3

首先,我知道这不是一个具体的代码问题,所以请随意投票关闭这个问题,但我今天大部分时间都在努力解决这个问题,需要一些帮助。我认为这个帖子也可以帮助任何试图在R中使用sftp协议的人,因为我会分享我今天所做的。

我一直在尝试更新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文件。具体而言:

  • /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,以免出现其他任何问题。重新安装后,我的文件被放回到它们各自的文件夹中(如上面所述)。

如果我要猜测,我可能不该移动.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"

如果有帮助的话

编辑 - 我应该指出,所有问题的根源当然是因为在R中curlVersion()$protocols中没有列出'sftp',所以当我运行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个回答

5

终于在Ubuntu 14.04的Docker容器中使用rstudio-server使其工作了,遇到了很多问题!但我花了比想象中更多的小时数去找到所有这些问题的解决方式,所以我打算把所有的步骤都放在这里,方便其他遇到同样问题的人。以下是我的做法:

在Linux终端中执行:

apt-get install libcurl4-openssl-dev

wget libssh2并编译

./configure

make

make install

wget curl并编译

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

make

make install

如果你需要在终端中使用sftp来运行curl,则可能仍然无法正常工作。请验证它是否正在使用你刚刚安装的新的libcurl.so.4。你刚刚安装的curl将安装在/usr/local/bin中,所以使用ldd来验证它没有使用旧的库文件。我的curl使用的是旧版libcurl,所以我将旧版libcurl链接到了/usr/local/lib下的新版libcurl,并重新编译了curl。

如果你想让RCurl正常工作,请将所有新的库文件(libcurl和libssh2)从/usr/local/lib复制到/lib,然后进入R控制台。

在R控制台中:

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

验证是否启用了sftp协议

libcurlVersion() RCurl::curlVersion()

这些命令将分别显示libcurl和RCurl所启用的协议。祝你好运,看看是否可以使用sftp!

以防万一,我也做了以下几件事,虽然它们可能没有太多用处,但当我遇到问题时我就一直坚持做下去了。

升级了R和R Studio-Server

在重新安装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()函数,但最终放弃了。


在运行 ./configure 之前,我必须运行 autoconf,但是你的解决方案对我很有帮助,谢谢! - Benoît Fayolle
我也遇到了同样的问题,使用curl -V命令可以正确列出sftp,但无法让R使用它。有什么建议吗? - Garglesoap

1

从源代码安装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,然后出于某种原因重新构建源代码。

安装了支持SSH的libcurl,更新了R使用的PATH,卸载了RCurl,然后按照上述方法从源代码重新安装,我解决了这个问题。 - JFD

1
在实践中,我发现尝试更新现有的curlopenssl安装比安装全新版本并更新将使用它们的PATH envars更加危险。
在我的情况下,我的新版支持sftp的curlopenssl被安装到了……
/usr/local/opt/curl-openssl/bin
/usr/local/opt/openssl/lib/

因此,我需要设置以下环境变量。
PATH="/usr/local/opt/curl-openssl/bin:${PATH}"
LIBRARY_PATH="/usr/local/opt/openssl/lib/:${LIBRARY_PATH}"

执行之前

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接