如何使用RCurl从SFTP获取数据?代码执行报错求助
解决RCurl从SFTP下载数据的错误问题
我来帮你排查下用RCurl从SFTP下载数据时遇到的问题哈,先梳理下代码里可能踩坑的地方,逐个解决应该就能搞定了:
1. 服务器地址格式搞混了
你现在的server变量里直接带了用户名(xxxx@sftp.xxxx.com),但后面又通过userpwd参数传了用户名密码,这会导致URL格式混乱。正确的做法是把服务器地址和用户名分开,URL里只放服务器地址,用户名密码统一通过userpwd传递:
server <- "sftp.xxxx.com" username <- "xxxx" userpwd <- paste0(username, ":yyy") # 这里yyy替换成你的真实登录密码
然后拼接URL的时候要记得加斜杠,把服务器地址和文件名分开:
url <- paste0(protocol, "://", server, "/", tsfrFilename)
2. .ppk密钥格式不兼容
你用的.ppk是PuTTY的私钥格式,但RCurl依赖的libcurl只认OpenSSH格式的私钥。得先把这个密钥转个格式:
- 打开PuTTYgen工具,加载你的
.ppk文件 - 点菜单栏的
Conversions->Export OpenSSH key - 保存成不带
.ppk后缀的文件(比如叫id_rsa)
然后把代码里的私钥路径换成转换后的文件:
ssh.private.keyfile = "/绝对路径/转换后的密钥文件名"
3. 密钥密码参数填错了
你代码里的keypasswd = "userpwd"是错的,这个参数是填私钥的保护密码(如果你的私钥设置了密码的话),不是登录SFTP的用户密码。要是私钥没设密码,直接删掉这一行就行;要是有密码,替换成真实的私钥密码:
# 私钥有密码的话这么写 keypasswd = "你的私钥密码" # 没密码就删掉上面这行
4. 补几个必要的SFTP连接选项
有时候需要额外设置几个选项来确保连接稳定,把你的opts改成这样试试:
opts = list( ssh.private.keyfile = "/转换后的密钥路径", keypasswd = "你的私钥密码", # 按需保留 ssh.host.keys = "auto", # 自动接受主机密钥,避免手动确认的问题 ftp.use.epsv = FALSE )
修正后的完整代码参考
library(RCurl) # 基础配置 protocol <- "sftp" server <- "sftp.xxxx.com" username <- "xxxx" userpwd <- paste0(username, ":yyy") # 替换成你的登录密码 tsfrFilename <- "cccccc.tsv" ouptFilename <- "out.csv" # 转换后的OpenSSH私钥路径 private_key_path <- "/绝对路径/id_rsa" # 私钥密码(没有的话删掉这行) private_key_pass <- "你的私钥密码" opts = list( ssh.private.keyfile = private_key_path, keypasswd = private_key_pass, # 无密码则删除此行 ssh.host.keys = "auto", ftp.use.epsv = FALSE ) # 下载数据 url <- paste0(protocol, "://", server, "/", tsfrFilename) data <- getURL(url = url, .opts = opts, userpwd = userpwd) # 保存到本地文件 write(data, file = ouptFilename)
额外要检查的点
- 私钥路径最好用绝对路径,避免R找不到文件的问题
- 如果SFTP服务器用的不是默认22端口,要在URL里加上,比如
sftp://sftp.xxxx.com:2222/cccccc.tsv - 确认你的IP能访问服务器的SFTP端口,没被防火墙挡住
内容的提问来源于stack exchange,提问作者ariel
相关产品推荐
相关产品推荐

